スタートHaskell第4回 まとめ

お疲れ様でした。 個人的に読み返したいツイートを #start_haskellハッシュタグから拾ってまとめました。 話の流れによっては時間を前後させてまとめています。
3
mori_dev @mori_dev

#start_haskell ここでの return は、必ず成功するというよりもむしろ、コンテナに包む と捉えるとわかりやすいとのこと。return というより wrap という名前の方がイメージしやすい。

2011-11-13 13:48:58
DMスパマーに乗っ取られました @master_q

しかしこの章にこの神スライドがまいおりたのは、、、もはや必然。。。! @ruicc さん。。。! #start_haskell

2011-11-13 13:51:54
慎ましく暮らす人 @qtamaki

関数を返す関数を返す関数を返す関数を返すぐらいの抽象度でよいの? #start_haskell

2011-11-13 13:53:55
(「・ω・)「ガオー @bicycle1885

サラっと関数返しちゃうのがすごいよね #start_haskell

2011-11-13 13:52:02
蟷螂 | kamakiri01 @kamakiri_ys

パーサとは、 type Parser a = String -> [(a, String)] の、関数。また、(>>=)はパーサを取って無名関数を返す? #start_haskell

2011-11-13 13:54:12
Noriyuki OHKAWA @notogawa

Haskellのreturnは一般的な命令型言語のreturnのような「元のルーチンにその値を"戻す"」のではなく「一度構造から取り出してイロイロやった結果を再度構造に"戻す"」でwrapとreconstructの中間くらいのニュアンスかと #start_haskell

2011-11-13 13:55:21
蟷螂 | kamakiri01 @kamakiri_ys

p >>=f は、pでパースした結果をfでもっとパースしたい時に使う #start_haskell

2011-11-13 13:56:03
蟷螂 | kamakiri01 @kamakiri_ys

p +++ q は、まずpでパースしてみて、成功したらqは使わず、失敗したらpの結果を捨ててqでパースする #start_haskell

2011-11-13 14:01:29
DMスパマーに乗っ取られました @master_q

たぶん違うと思います。。。tanakhさんの"床下配線"という用語がいちばんぴったり RT @brain_apple: (>>=)って継続? #start_haskell

2011-11-13 14:01:51
(「・ω・)「ガオー @bicycle1885

(>>)のほうが継続に近いでしょうか? RT @master_q: たぶん違うと思います。。。tanakhさんの"床下配線"という用語がいちばんぴったり RT @brain_apple: (>>=)って継続? #start_haskell

2011-11-13 14:08:53
日比野 啓 (Kei Hibino) @khibino

>>= は単なるインターフェースです。継続は実装。 継続モナドを実装しているライブラリもあります RT @brain_apple (>>)のほうが継続に近いでしょうか? #start_haskell

2011-11-13 14:14:53

床下配線

スライド27枚目。
見えないところを置き換えて抽象度を高くする。
http://www.slideshare.net/tanakh/monad-tutorial

Noriyuki OHKAWA @notogawa

このあたりのbindはSICP後のほうがスンナリと飲み込めるハズ #start_haskell

2011-11-13 13:58:41
Masayuki ITOU @mmitou

無名関数開き括弧はその無名関数を作っている関数のお尻で閉じられるのか。 確かに練習問題やっててどこで閉じられてるのかわからなかった。 #start_haskell

2011-11-13 14:08:51
山本和彦 @kazu_yamamoto

間違った。正しくは p1 >> p2 = p1 >>= \_ -> p2 です。 #start_haskell

2011-11-13 14:13:03
蟷螂 | kamakiri01 @kamakiri_ys

>>=コンビネータでパーサを書くとカオス #start_haskell ))))の一番内側にreturnがあり、returnの引数の(func s num p num2)は外側のスコープから取ってきた値

2011-11-13 14:07:04

-スライド36枚目より、無名関数のコード

パーサーコンビネータ

double =
sign >>= \s ->
digits >>= qnum ->
point >>= \p ->
digits >>= \num2 ->
return (func s num p num2)

do記法

double = do
s <- sign
num <- digits
p <- point
num2 <- digits
return (func s num p num2)

蟷螂 | kamakiri01 @kamakiri_ys

Parser a型に現れているaの型情報だけでパーサが書ける。parser a -> [(a,String)]のString型は裏に隠されている。抽象度が高い #start_haskell

2011-11-13 14:14:42
Seizan Shimazaki @seizans

P93下の方の p がわかりにくい(do を >>= に変換できず困る)と思うのですが、do 以降はこんな風に書けます。 #start_haskell   item >>= \x -> item >>= \_ -> item >>= \y -> return (x, y)

2011-11-13 14:17:50
蟷螂 | kamakiri01 @kamakiri_ys

文字列を数式として扱うパーサを書くにあたって、(*)は(+)より結合順位が高い(先に計算する)。これを型定義として書き、パーサとして書き下すとパーサ出来上がり #start_haskell

2011-11-13 14:21:04