2007年1月23日 (火)

[Haskell] YAHT

8.2まで読了。type synonym と newtype は、初めて知った(と思う。)

| | コメント (0) | トラックバック (0)

2007年1月22日 (月)

[Haskell] YAHT

Chapter 7 読了。 foldr は、すんなりとわからない。 じっくり考えて、やっとぼんやり、わかってくるような感じだ。

| | コメント (0) | トラックバック (0)

2007年1月21日 (日)

[Haskell] YAHT

7.10まで読了。 Finite Map のキーのtypeは、Ordのインスタンスでなくてはならない。 Eqのインスタンスじゃ駄目な理由は、"balanced trees"にしたいから。 高速にアクセスアクセスするために、tree構造をしていて、そのためには、 キーのtypeはOrdのインスタンスでないといけない。

ということだろうか。

| | コメント (0) | トラックバック (0)

2007年1月19日 (金)

[Haskell] YAHT

7.8まで読了。List に感するあれこれ。 遅延評価とList、map の数学風の表現など。 遅延評価のおかげで、上(下)限を気にしなくてもいいのがHaskellの特徴。

| | コメント (0) | トラックバック (0)

2007年1月15日 (月)

[Haskell] YAHT

7.6.2 まで読了。 折り返し点通過。 Haskell の Class は、抽象クラスみたいな気がした。 RubyでいうModuleに相当する気がしてきた。

| | コメント (0) | トラックバック (0)

2007年1月14日 (日)

[Haskell] YAHT

7.5まで読了。 matching の機能をさらに一歩進めたような guards の話。

| | コメント (0) | トラックバック (0)

2007年1月13日 (土)

[Haskell] YAHT

7.4読了。 matchingの話。 こういう機能があると、分岐処理を書かなくてすむ。 2つ1つの関数定義は短くなるし、そのケースだけ考えればよいので、わかりやすい。 が、下手に分割するとそれぞれの関数で同じ処理を書かなくてはならなくなる という危険性もある。

| | コメント (0) | トラックバック (0)

2007年1月12日 (金)

[Haskell]YAHT

7.3まで読了。 curry とか、uncurry とか、flip とか、今まで、よくわからなかった関数がすこしわかった気がする。 こういう関数が用意されているところが、関数型プログラミング言語らしいと言えるのかな。

| | コメント (0) | トラックバック (0)

2007年1月11日 (木)

[Haskell] YAHT

7.2 読了。 where と let の話。

letの方がwhereより読みづらいと感じるのは、何故だろうか。 Cの関数だと変数定義が先なので、letスタイルの方が近いはずなのに。 多分、let の後の in に違和感を感じているのだと思う。

| | コメント (0) | トラックバック (0)

2007年1月10日 (水)

[Haskell] YAHT

7.1まで読了。

map (+ 3) [1, 2, 3]

は、大丈夫で、

map (- 3) [1, 2, 3]

は、なぜ駄目かという話など。

- 3 は、数の「-3」と解釈されるから。

ちなみに、

map (+ (-3)) [1, 2, 3]

は、大丈夫。

| | コメント (0) | トラックバック (0)

2007年1月 9日 (火)

[Haskell] YAHT

6.3、6.4を読了。 6.3は、階層的なImportの話。 6.4は、文芸的プログラミングの話。

| | コメント (0) | トラックバック (0)

2007年1月 8日 (月)

[Haskell] YAHT

6.2まで読了。Importで関数などの名前衝突をどのように避けるかという話。

| | コメント (0) | トラックバック (0)

2007年1月 7日 (日)

[Haskell] YAHT

6.1 Exports まで読了。

| | コメント (0) | トラックバック (0)

2007年1月 6日 (土)

[Haskell] YAHT

中断していたのを再開。Chapter 5まで読んだ。 問題5.2の回答例だと指定したファイルが存在しないときにreadさせたときの 動作が出題通りにならないと思う。 その辺は10.1まで進まないとわからないということで。

ブランクがあったため、結構忘れてる。

| | コメント (0) | トラックバック (0)

2006年9月17日 (日)

[Haskell] YAHT bracket

5.3まで読んだ。 P.64のbracketの解説のコードを見たときに 一瞬、

(\h -> hPutChar h c)

の h って何になるのかと悩んでしまう。

bracketはIOに特化した関数みたいだけど、特化しない仕組みはないのかな。

Ruby の begin ... rescue ... ensure ... end みたいなの。

| | コメント (0) | トラックバック (0)

[Haskell] YAHT case式

5.2まで読んだ。

Exercise 5.1 で何も考えずに

case name of
    "John" -> ...
    "Simon" -> ...
    ...
    otherwise -> ...

と書いた。エラーにならなかった。 これって正しいんだろうか。

解答例は

case name of
    "John" -> ...
    "Simon" -> ...
    ...
    _ -> ...

なんだけど。guardじゃないんだから、_を使うべきなんでしょうね。

どうも、otherwiseじゃなくてhogeとか何でもいいっぽい。うーむ。

| | コメント (0) | トラックバック (0)

2006年9月11日 (月)

[Haskell] YAHT

4.6をながめた(難しくて読めない)。 Haskellにも継続があることを知った。 Schemeの継続もわからないけど、 Haskellのもさっぱりわからない。

Exercise 4.12 の答がない。 こんな感じでいいんだろうか。

cfold' f z [] = z
cfold' f z (x:xs) = f x z (\y -> cfold' f y xs)
mymap f l = cfold' (\x t g -> f x : (g t)) [] l
myfilter f l = cfold' (\x t g -> 
                        if (f x) then x : (g t) 
                                 else (g t)) [] l

| | コメント (0) | トラックバック (0)

[Haskell] YAHT

4.5まで読んだ。 datatypeはちょっと消化不良な感じだけど、気にせず、次に進むことにする。

| | コメント (0) | トラックバック (0)

[Haskell] Haskellのソースの行数をカウントするプログラム

書いてみた。かなり怪しいプログラム。 (count_src.hs) guardのネストはできないのだろうか。 初心者が書いたので、多分、ツッコミどころ満載。 誰か添削してくれないだろうか。

| | コメント (0) | トラックバック (0)

2006年9月10日 (日)

[Haskell] YAHT

4.5.3まで読んだ。 listLength を実際に動作させるには、Consを定義しなくてはならないと思うんだけど どうしたらいいのだろうか。

| | コメント (0) | トラックバック (0)

2006年9月 9日 (土)

[Haskell] YAHT

4.5.2 まで読んだ。 datatypeもEitherもさっぱりわからない。

| | コメント (0) | トラックバック (0)

2006年9月 4日 (月)

[Haskell] YAHT

4.5.1まで読んだ。 もろもろの都合により、ペースが落ちそうな予感。

| | コメント (0) | トラックバック (0)

[Haskell] listの要素を出力する

listの要素のそれぞれになんか関数を適用した結果のlistを返すには、mapを使います。

ary = [1, 2, 3]
func1 x = 2 * x
map func1 ary -- -> [2, 4, 6]

では、一般に、listの要素を順番に出力したい場合はどうすれば良いのでしょうか。 例えば、

output x = putStr (show x ++ "\n")

がある場合に、listの一つ一つの要素に outputを適用させたい場合です。 発想を変えて、出力したい最終形の文字列を生成してからputStrを使う次の形式

outputstr x = show x 
putStr $ unlines $ map outputstr ary

にするか再帰を使うしかないのでしょうか。

| | コメント (0) | トラックバック (0)

2006年9月 3日 (日)

[Haskell] コメント

Haskellのコメントの

{- ... -} 

は、入れ子にできる。ふと、Cと同じような動きをするかと思って

{-
   Is this comment?
{-
-}

と、

{-
-}
  Is this comment?
-}

を試してみた。 両方とも、エラーになったけど、メッセージが違った。

| | コメント (0) | トラックバック (0)

2006年9月 2日 (土)

[Haskell] head の 型(YAHT)

4.4まで読んだ。

headの型は

head :: [a] -> a

なので、

head . head

の型は、タイプエラーになるかと思ったら、

head . head :: [[a]] -> a

だった。 なるほど。

(head . head) ["abcde"]

の結果は 'a' である。

| | コメント (0) | トラックバック (0)