2/6 夜会話

サモンナイト風タイトルの忘備録。

map (+) ってどんなの返ってくるの?

...というのをつらつらと書き連ねていたことからスタート。
今回は分かんなかったので、これは後々の課題。

ここでは話を簡単にするために(+)はOCamlの(+)*1のみとして考えていった。

map :: (a -> b) -> [a] -> [b]
(+) :: (int -> (int -> int) )

これをa, bに合わせると、
map :: (int -> (int -> int)) -> [int] -> [(int -> int)]

なんじゃこりゃー。何に使うのかよくわからん。まだ。

んで、この変換がどうにもしっくりこない。
int -> int -> intを (int -> (int -> int))にすっと変換して考えられなかった。

色々話してるうちにたどり着いたのが、値の世界や、高等数学のレベルだと、関数は「複数の値を取り、1つの値を返す」もの。
そのため、+であれば、 (+) :: int×int -> int のような感覚を「自分はより直観的」と感じる。
なので、int -> int -> intを (int -> int) -> int と結合するかのように錯覚しており、
すぐには出てこなかった。
最初はゆっくり、()を付けて考えるぐらいでいいと思う。


確率ならった時に、確率関数とかただの高階関数に過ぎないのに、それが分からないからすごくわかんなくなる。
値以外にも関数も返せることを離散数学のレベルで教えるべき。


haskell-platformとlrwrapをaptitude install。
Programming Haskellの課題をHaskellOCamlで解いてgit-hub(a-hisame)に上げる。

*1:int->int->int