Drkcore

17 12 2009 Haskell Tweet

Haskellの型というかデータコンストラクタ

構成子関数は評価済みであり、それ以上簡約できないとはどういうことなんだろうか?

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

確かに、いろいろ入り混じって混同してました

  • このMyAdd型はInt->Intの別名ではなくて
  • barは「何か入れた器」であって関数ではないので

よくよく考えてみるに、僕はこの右辺を(Int -> Int)という(ラムダ関数みたいなもの)にMyAddっていうラベルをつけるみたいなイメージを漠然と持っていたようです。

data MyAdd = MyAdd (Int -> Int)

で、

let add5 = MyAdd (\n -> n + 5)

とやると(MyAdd型にラベル付けされた)関数に束縛されたadd5っていう変数が生まれると。 だから型で一時停止してその先には(\n -> n + 5)っていう関数が待っているのかなぁつまり、

型とは簡約のレベル(深さ)を定義するってこと?

という、冒頭のような勘違いをしていた。

型とは新規な器みたいなものだと捉えられるようになったら、下の話も理解できた。

mzp

@kzfm うーん、うまく説明できないんですが、そもそも単なる別名になってほしくないからnewtypeを使っていて、別名になってほしいならtypeを使うと思うんです。だから、Parse型の値に引数を適用できないのは、そのほうが型チェックの恩恵を受けれるからだと思います。

koyama41

@kzfm newtypeは結果的に一個の型に別名をつけるだけに見えてしまうのでtype文に似てるように思ってしまうのですが、むしろdata文の特殊な形と思った方がいいと思います

ProductName プログラミングHaskell
Graham Hutton
オーム社 / ¥ 2,940 ()
在庫あり。

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021