> うわぁ。 来ましたね。 > 私の現在の理解度より上のレベルですが > ちょっとがんばってみました。
このパズルはどちらかというと、実装系よりの感じがします。 はっきり言ってイヂワル問題です。(たぶん ^^;) > > >(1) e1 と e2 は等しいですか? > > > >f (x:xs) y = x > >g (x:xs) = \y -> x > > > >e1 = seq (f []) 1 > >e2 = seq (g []) 1 > > まず、リファレンスを見て調べたのですが、 > seq の定義が見つかりませんでした (- -;; seq は組み込みの関数で seq :: a -> b -> b 第一引数を正格(strict)に評価する。模式的には seq _|_ b = _|_ seq a b = b, if a /= _|_ てなかんじです。Haskell のプレリュードで定義されており、 「Haskell 98 レポート」の 6.2 節に解説があります。 http://www.sampou.org/haskell/report-j/basic.html#sect6.2 で、e1 と e2 は実行してみれば結果はわかります。 e1 は 1、e2 は error です。 元記事の後に答と説明がついています。 この記事の投稿者はこの結果は気に入らないようですね。 > (2) e1 と e2 は等しいですか? > どちらがより良い定義ですか? > (h x = nfib 30 はどうですか?) > > > f = const (nfib 30) > > g = \x -> nfib 30 > > > > e1 = f 1 + f 2 > > e2 = g 1 + g 2 > > ここはわかりません ゴメンナサイ。 これは値としては等しいですが、処理系がグラフ簡約をつかっていれば、 効率が違います。e2 では nfib 30 は 2 度評価されます。一方、e1 では、 nfib 30 では一度だけです。 > (3) e1 と e2 は等しいですか? > Hugs で評価するとどうなりますか? > > >f = \x -> x + x > >g x = x + x > > > >e1 = f 1.0 + f 2.0 > >e2 = g 1.0 + g 2.0 > > > > これは e1 e2 ともに等しい値だと思います。 本来等しくて良いはずですが、Hugs では型エラーをおこします。 > 就活中につき、処理系使ってませんが (^ ^; -- ストレスがたまるでしょうから、そのような厳しい縛りは中止して、 -- 時間で縛るほうがいいのでは。。。(余計なお世話 > 私) --nobsun -- ML: [EMAIL PROTECTED] 使い方: http://QuickML.com/