構成子関数は評価済みであり、それ以上簡約できないとはどういうことなんだろうか?
data MyAdd = MyAdd {ev :: (Int -> Int)}
これはIntをとってIntを返す関数を表す型
*Main> let add5 = MyAdd (\n -> n + 5)
*Main> :t add5
add5 :: MyAdd
MyAdd型ってなっててこれ以上簡約できない。でも実態はラムダ式なんでしょってことで、Intを渡すとエラー
*Main>add5 3
<interactive>:1:0:
Couldn't match expected type `t1 -> t'
against inferred type `MyAdd'
In the expression: add5 3
In the definition of `it': it = add5 3
evアクセサをつかってアクセスする。
*Main> ev add5 3
8
要するに型とは簡約のレベル(深さ)を定義するってこと?
追記 091217
構成子関数はこういう型だと認識して納得。その後TLを追いかけ直して、理解した。
MyAdd :: (Int -> Int) -> MyAdd
よくよく考えてみるに、僕はこの右辺を(Int -> Int)という(ラムダ関数みたいなもの)にMyAddっていうラベルをつけるみたいなイメージを漠然と持っていたようです。
data MyAdd = MyAdd (Int -> Int)
で、
let add5 = MyAdd (\n -> n + 5)
とやると(MyAdd型にラベル付けされた)関数に束縛されたadd5っていう変数が生まれると。 だから型で一時停止してその先には(\n -> n + 5)っていう関数が待っているのかなぁつまり、
型とは簡約のレベル(深さ)を定義するってこと?
という、冒頭のような勘違いをしていた。
型とは新規な器みたいなものだと捉えられるようになったら、下の話も理解できた。
@kzfm うーん、うまく説明できないんですが、そもそも単なる別名になってほしくないからnewtypeを使っていて、別名になってほしいならtypeを使うと思うんです。だから、Parse型の値に引数を適用できないのは、そのほうが型チェックの恩恵を受けれるからだと思います。
@kzfm newtypeは結果的に一個の型に別名をつけるだけに見えてしまうのでtype文に似てるように思ってしまうのですが、むしろdata文の特殊な形と思った方がいいと思います
Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。