>  うわぁ。 来ましたね。
>  私の現在の理解度より上のレベルですが
>  ちょっとがんばってみました。

このパズルはどちらかというと、実装系よりの感じがします。
はっきり言ってイヂワル問題です。(たぶん ^^;)

> 
> >(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/

メールによる返信