| ホーム > Haskell > 2004年12月24日 > monadについて、nobsunからヒント | 記事の検索 | サイト検索 | 更新情報 |
| プロフィール | 記事一覧 | リンク集 | RSS |
|
結城からnobsunへ
いまはMonadを読み始めています。 要するにこれは手続きを抽象化しているのではないかと 踏んでいるところです。 成功、失敗、結果を使って次のことをする、1つのことの次に次のことをする…
nobsunから結城へ
> いまはMonadを読み始めています。
> 要するにこれは手続きを抽象化しているのではないかと
> 踏んでいるところです。
するどいですねぇ。結城さんの直観と洞察は、いつも感動します。
(>>=) は (flip ($)) の拡張と看倣せますよね。
> 成功、失敗、結果を使って次のことをする、1つのことの次に次のことをする…
Haskell が現在の仕様になる以前、Gofer という処理系がありました。
(Hugs は Haskell User's Gofer System)
型構築子クラス、モナドIO などは Gofer で最初に実装され、あとから、
Haskell の仕様にとりいれられました。
Gofer では、型構築子クラスがとりいれられたときに、Functor クラス
Monad クラスが定義されました。(これらは現在の Haskell のものと
本質的には同じですが、method 名がちがっていました。)
このとき、List もモナドとして定義されなおしました。
同時に、List Comprehension のセマンティクスが拡張されて
Monad Comprehension と呼ばれました。たとえば、
[ f x y | x <- xs, y <- ys ]
これは、
bind xs (\ x ->
bind ys (\ y ->
unit (f x y)))
の構文糖衣とされました。いまの Monad のメソッド名をつかうと
(>>=) xs (\ x ->
(>>=) ys (\ y ->
return (f x y)))
つまり、
xs >>= (\ x ->
ys >>= (\ y ->
return (f x y)
ですね。昔の bind というメソッド名と、Monad Comprehesion 構文から、
なんとなく、
let
x = ...
y = ...
in
f x y
という let の構文を想像しませんか。
(意味としては、ここでの let は Scheme の let* だとおもってください。)
do構文が採用される以前のころは、
「do」ではなく、「do-let」と呼んだ人(Wadlerだったかなぁ)もいたようです。
今の Haskell に導入さた do 構文で書くと、
do
x <- xs
y <- ys
return (f x y)
となるわけです。Haskellでは計算の順序を指定することはできません。
しかし、束縛の入れ子で、計算の順序づけを模倣することができます。
それで、計算の順序が本質であるような IO に Monad を使うのは理に
かなっているということのようです。
(他にも理由はあるとは思いますが^^;)
ここまでの説明は、あくまでも私の想像や理解ではこうであるということです。
厳密な説明ではありませんし、微妙に間違いの部分もあると思いますが、
なにかのHintになるかもしれないと思って書きました。
[monad][nobsun] 2004年12月24日 09:40
2006 [ 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 ]
2005 [ 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 ]
2004 [ 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 ]
book(3) / char(2) / compiler(3) / craft(5) / data(7) / enum(1) / geb(2) / hawiki(1) / hugs(1) / info(1) / io(3) / list(2) / map(3) / monad(16) / nobsun(12) / report(4) / sicp(2) / soe(8) / suchthat(2) / yaht(8)