2016-05-20 2 views

答えて

6

いいえ機能をお互いに比較する方法はありません。 f == gを評価することさえできません。

これを行うことができれば(そしておそらくIOにアクセスして関数のメモリアドレスを調べることによって)、参照透過性に違反することになります。以下の定義を考えてみましょう:

f = (+) 2 
g x = 2 + x 

これら2つの関数は、あなたが同義的にそれらを扱うことができ、参照透明性を意味し、すべての入力に対して同じように動作:foo f任意のfooためfoo gに等しくなるべきである、と結果foo f gようでなければなりませんfoo g fと同じです。しかし、fooをあなたの(<)の機能にさせると、この法律は破られます。ハスケルの多くは参照の透明性に依存しているので、あなたがこれを欺くために何らかの方法を見つけることができたとしても、私はそうしないことを勧めます。

しかし、あなたはIOを使用したい場合、私は署名で関数を記述することは比較的無害であると思う:

(<) :: a -> b -> IO Bool 

二つの引数のメモリアドレスを見ることで。

+0

まだ決まっていませんが、それは決まっていませんが、何らかの形でですか? –

+0

関数で行うことができるのは、ポイントで評価することだけです。 –

+0

Haskell言語に晒されている関数の一意の識別子はありません。 –

3

あなたはちょっとcanです。 a -> baが有限で、bを注文することができる場合は、xの場合はf xg xを、aの場合はf x /= g xまでと比較するだけです。これは、有限のaの関数がn進のタプルと同形であるため、タプルを比較するのと同じです。

+0

おいしい表現可能なファンクタ! – dfeuer

+1

@dfeuer、表現可能なファンクスクラスは大きすぎますね。これには、「ストリーム」のような共導型が含まれます。まあ、 'Ord'を想定して' Integer - > b'の 'Ord'インスタンスを定義することはできますが、' id user3237465

+0

ああ、良い点。 – dfeuer

関連する問題