monadについて、nobsunからヒント

2004年12月24日 結城浩

結城から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 ]

Bloglines

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)

記事検索 サイト検索はこちら

豊かな人生のための四つの法則