[Haskell] YAHT
8.2まで読了。type synonym と newtype は、初めて知った(と思う。)
| 固定リンク | コメント (0) | トラックバック (0)
Chapter 7 読了。 foldr は、すんなりとわからない。 じっくり考えて、やっとぼんやり、わかってくるような感じだ。
| 固定リンク | コメント (0) | トラックバック (0)
7.10まで読了。 Finite Map のキーのtypeは、Ordのインスタンスでなくてはならない。 Eqのインスタンスじゃ駄目な理由は、"balanced trees"にしたいから。 高速にアクセスアクセスするために、tree構造をしていて、そのためには、 キーのtypeはOrdのインスタンスでないといけない。
ということだろうか。
| 固定リンク | コメント (0) | トラックバック (0)
7.8まで読了。List に感するあれこれ。 遅延評価とList、map の数学風の表現など。 遅延評価のおかげで、上(下)限を気にしなくてもいいのがHaskellの特徴。
| 固定リンク | コメント (0) | トラックバック (0)
7.6.2 まで読了。 折り返し点通過。 Haskell の Class は、抽象クラスみたいな気がした。 RubyでいうModuleに相当する気がしてきた。
| 固定リンク | コメント (0) | トラックバック (0)
7.4読了。 matchingの話。 こういう機能があると、分岐処理を書かなくてすむ。 2つ1つの関数定義は短くなるし、そのケースだけ考えればよいので、わかりやすい。 が、下手に分割するとそれぞれの関数で同じ処理を書かなくてはならなくなる という危険性もある。
| 固定リンク | コメント (0) | トラックバック (0)
7.3まで読了。 curry とか、uncurry とか、flip とか、今まで、よくわからなかった関数がすこしわかった気がする。 こういう関数が用意されているところが、関数型プログラミング言語らしいと言えるのかな。
| 固定リンク | コメント (0) | トラックバック (0)
7.2 読了。 where と let の話。
letの方がwhereより読みづらいと感じるのは、何故だろうか。 Cの関数だと変数定義が先なので、letスタイルの方が近いはずなのに。 多分、let の後の in に違和感を感じているのだと思う。
| 固定リンク | コメント (0) | トラックバック (0)
7.1まで読了。
map (+ 3) [1, 2, 3]
は、大丈夫で、
map (- 3) [1, 2, 3]
は、なぜ駄目かという話など。
- 3 は、数の「-3」と解釈されるから。
ちなみに、
map (+ (-3)) [1, 2, 3]
は、大丈夫。
| 固定リンク | コメント (0) | トラックバック (0)
中断していたのを再開。Chapter 5まで読んだ。 問題5.2の回答例だと指定したファイルが存在しないときにreadさせたときの 動作が出題通りにならないと思う。 その辺は10.1まで進まないとわからないということで。
ブランクがあったため、結構忘れてる。
| 固定リンク | コメント (0) | トラックバック (0)
5.3まで読んだ。 P.64のbracketの解説のコードを見たときに 一瞬、
(\h -> hPutChar h c)
の h って何になるのかと悩んでしまう。
bracketはIOに特化した関数みたいだけど、特化しない仕組みはないのかな。
Ruby の begin ... rescue ... ensure ... end みたいなの。
| 固定リンク | コメント (0) | トラックバック (0)
5.2まで読んだ。
Exercise 5.1 で何も考えずに
case name of
"John" -> ...
"Simon" -> ...
...
otherwise -> ...
と書いた。エラーにならなかった。 これって正しいんだろうか。
解答例は
case name of
"John" -> ...
"Simon" -> ...
...
_ -> ...
なんだけど。guardじゃないんだから、_を使うべきなんでしょうね。
どうも、otherwiseじゃなくてhogeとか何でもいいっぽい。うーむ。
| 固定リンク | コメント (0) | トラックバック (0)
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)
書いてみた。かなり怪しいプログラム。 (count_src.hs) guardのネストはできないのだろうか。 初心者が書いたので、多分、ツッコミどころ満載。 誰か添削してくれないだろうか。
| 固定リンク | コメント (0) | トラックバック (0)
4.5.3まで読んだ。 listLength を実際に動作させるには、Consを定義しなくてはならないと思うんだけど どうしたらいいのだろうか。
| 固定リンク | コメント (0) | トラックバック (0)
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)
Haskellのコメントの
{- ... -}
は、入れ子にできる。ふと、Cと同じような動きをするかと思って
{-
Is this comment?
{-
-}
と、
{-
-}
Is this comment?
-}
を試してみた。 両方とも、エラーになったけど、メッセージが違った。
| 固定リンク | コメント (0) | トラックバック (0)
4.4まで読んだ。
headの型は
head :: [a] -> a
なので、
head . head
の型は、タイプエラーになるかと思ったら、
head . head :: [[a]] -> a
だった。 なるほど。
(head . head) ["abcde"]
の結果は 'a' である。
| 固定リンク | コメント (0) | トラックバック (0)
最近のコメント