さかいです。

From: Shin-ichiro HARA <sinara / blade.nagaokaut.ac.jp>
Date: Fri, 26 Dec 2003 16:45:32 +0900

> > data Poset = forall a. Poset [a] (a -> a -> Bool)
> > power :: Poset -> Poset -> Poset
> 
> これです!私も iterate を使えるような型を作ろうとしていたんですが、
> どうしてもできなくて。forall というのがあるんだ!

ちなみに、こうするとデータ構築子Posetは
Poset :: forall a. [a] -> (a -> a -> Bool) -> Poset
という型を持つのですが、

∀a. [a] -> (a -> a -> Bool) -> Poset
= ∀a. [a]×(a -> a -> Bool) -> Poset
= (∃a. [a]×(a -> a -> Bool) -> Poset

なので、このforallは存在限量による抽象データ型を
Haskellで表現するためのテクニックとして使われています。

> と、いうことは Haskell で、逆極限法の一歩手前まで実現できるという
> ことですね。一歩手前と後とどのぐらいのギャップがあるか知らないけど。

あとは、これらのCPOの無限個の直積を作って、
そこから埋め込みと射影の関係を満たす部分集合をとればいいわけですよね。
さて、どう表現するかなぁ……

> > ところで、これを原さんのRuby版と同様にコマンドライン引数を受け取るように
> > 変更しようと思ったのですが、思うように書くことが出来ませんでした。
> > コマンドライン引数を扱う際の定石みたいなものってあるのでしょうか?
> 
> 以下、少しいじってみましたが、そんなにしっくりしているわけでもない。
> 定石があるなら私も知りたいです。

なるほど。
これだとreturnを変に使わなくても済むのがいいですね。

> main :: IO ()
> 
> main =
>     do n:o:_ <- mfunct (map read . update ["3", "2"]) getArgs
>        putStrLn (showGraph ((chain o) !! n))
>     where update (d:ds) (a:as) = a : update ds as
>           update [] as = as
>           update ds [] = ds
>           mfunct f = (>>= return.f)

ちなみに、このmfunctはMonadモジュールにliftMという名前であります。
IOはFunctorクラスのインスタンスになってるのでfmapでもOKです。

--
酒井 政裕 / Masahiro Sakai

--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/