関数のコレクションに対して部分的な順序を任意に設定できる方法はありますか?Haskellで関数のエンコーディングを比較する
つまり、与えられた2つの関数f、g;私は一貫してf < gをいくつかの真理値に評価できますか?
関数のコレクションに対して部分的な順序を任意に設定できる方法はありますか?Haskellで関数のエンコーディングを比較する
つまり、与えられた2つの関数f、g;私は一貫してf < gをいくつかの真理値に評価できますか?
いいえ機能をお互いに比較する方法はありません。 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
二つの引数のメモリアドレスを見ることで。
あなたはちょっとcanです。 a -> b
a
が有限で、b
を注文することができる場合は、x
の場合はf x
とg x
を、a
の場合はf x /= g x
までと比較するだけです。これは、有限のa
の関数がn進のタプルと同形であるため、タプルを比較するのと同じです。
おいしい表現可能なファンクタ! – dfeuer
@dfeuer、表現可能なファンクスクラスは大きすぎますね。これには、「ストリーム」のような共導型が含まれます。まあ、 'Ord'を想定して' Integer - > b'の 'Ord'インスタンスを定義することはできますが、' id
ああ、良い点。 – dfeuer
まだ決まっていませんが、それは決まっていませんが、何らかの形でですか? –
関数で行うことができるのは、ポイントで評価することだけです。 –
Haskell言語に晒されている関数の一意の識別子はありません。 –