5

Haskell の設計を学び、理解しようとしています。私は現在ラムダ/匿名関数を使用していますが、疑問に思っていました.

関数型が Eq クラスのインスタンスでないのはなぜですか?

Prelude> (\z -> z + 5) == (+5)

この質問について、すべてのラムダ関数で z は何でもかまいませんし、自由変数でさえあるかもしれないので、Eq 型のラムダ関数を作成するのは設計上の欠陥になるのではないかと思っていました。

型クラス Show の関数型インスタンスが表示されないのはなぜですか?

Prelude> (\q -> q - 2)

明確にしていただければ幸いです。

よろしくお願いします!

4

4 に答える 4

1

私はみんなの答えが好きです...彼らは理にかなっているようです。この段階では、関数がデフォルトで Eq と Show のインスタンスとして設定されていない理由に答えられるとは思いません。これは、自分で試してみるためのアイデアを与えるかもしれない実験です。

Prelude> :set -XFlexibleInstances
Prelude> instance Eq (Int -> Int) where x == y = map x [0..10] == map y [0..10]
Prelude> ((\z -> z+5) :: Int -> Int) == ((+5) :: Int -> Int)
True
Prelude> instance Show (Int -> Int) where show x = show (zip [0..10] (map x [0..10]))
Prelude> (\q -> q-2) :: (Int -> Int)
[(0,-2),(1,-1),(2,0),(3,1),(4,2),(5,3),(6,4),(7,5),(8,6),(9,7),(10,8)]
于 2013-04-05T23:50:36.803 に答える