2013/07/15

すごいHaskellたのしく学ぼう! を読み終えた

いわゆる「すごいH本」を一応読み終えました。一応。

実を言うとゴールデンウィークくらいから読み始めて、しばらく読んだあとに時間が取れなくなって放置、そして今さっき最後まで読み終える、みたいな流れでした。
ながいごーるでんうぃーくだったなー。

Haskell の入門書として良い感じ、という評判に漏れず、いろいろとさらえた感じ。
実際 Haskell 使ってるわけじゃないので、まだまだ入口にも辿りついてない可能性もありますが。
とりあえず内容としては基本的な構文から関数定義に始まり、再帰関数の話や型定義、くらいまでが他言語から聞いたことあるような話。
んで、 IO, Functor, Applicative Functor, Monad, Zipper くらいから Haskell 特有な感じかなー、と。

こうやって書いてると Haskell 特有なところ、理解度低い感じしてかなしい。
とりあえず、Haskell書くなら手元に置いておきたい一冊かなー、と思う。


んで、Haskell そのものについてコメントるのは以下くらい。
  • pattern match
  • guard
  • where
  • data type
  • Functor, Applicative Functor
  • Monad


pattern match

Haskell では関数定義の時にパターンマッチって構文があるみたいです。
こんなん。
fib 0 = 0
fib 1 = 1
fib n = fib(n-1) + fib(n-2)
フィボナッチ数列を計算する fib 関数。
fib に渡す値が 0 ならー、みたいな if を書かずに書ける、って感じみたいです。
0ならこう、って直接書ける。
あと、 pattern match を使えば 強制的に早期 return になるのも良いなー、と


guard

pattern match の条件版みたいなやつ。
こんなん。
isPlus n
    | n > 0     = True
    | otherwise = False

これは0より大きかったら True を、それ以外は False を返す関数。
条件にあったらここ実行して、みたいなやつをこう書ける。
もちろん条件は複数書いて良い。
otherwise が case の default というか else というか。
pattern match もだけれど、上から調べていくので、 Haskell は巨大な switch 、とかって言ってる方もいたよーな。
これも早期 return っぽくなるし、良いんじゃないかなー、とか


where

これも関数定義。
関数のみ有効なスコープの関数を定義できる。
lambda 以上 定義した関数以下、って気分。
スコープを汚さずに、繰り返し処理を書かなくて良い感じ。
let でも同じことができるっぽい。 let は上に書いて where は下に書く。個人的には where 派かも。
こんなん。
squareMinNumber x
    | square x > 100 = x
    | otherwise      = square x
    where square x = x * x
2乗して100以上ならそのままの数値、100以下なら2乗する、って関数。
x * x を2回書かなくて良い、みたいな。

data, class

この辺からあやしい。
とりあえず、型変数が無い型は enum みたいだなー、とか思ったり。
型変数があるやつは class 的に扱えば良いのかな、とか思うけれど自作する場面がふと思いつかない。
木構造とか、リストとか、自分でデータ型を定義とかしないと恩恵や実感湧かなさそう。むむ。
class は なんか Java の Interface チック。
この型 class に所属するものはこの関数が使える、みたいな。


Functor, Applicative Functor

この辺までくると言われたことをやってる感じ。
Functor で包む利点ってなんなのかなー、とか思い始める。
リストは非決定性演算に使えるっぽいけれど、発想が未だArrayなので追いついてない感。


Monad

よー分かんない感じになってくる。
とりえあずいろんな記事とか見てて「プログラマブルなセミコロン」とかあったので、自分なりにMonadを作ってみようとしたけれど ghc に怒られてる。
個人的には、>>= を使って Monad な演算をする分には「モナドに包まれた値に対する演算時に、モナドに付属する値(Maybeとか?)にも演算が同時にできる」ものだと思ってるけれど。
実際謎っぽい。ぐーぬ。
とりあえずもしちゃんと書けたら記事を書こうとは思っている。
もしかしたら「書けませんでした」記事になるやもしれない。
あ、でも Maybe Monad 便利そうだなー、とは思った。使えるかどうかはアレ。


まとめ

Haskell分かってない。

0 件のコメント:

コメントを投稿