this answerでは、id
がforall a. a -> a
の唯一の住人であることを示す方法を示しています。これを行うには、形式がYoneda lemmaを使用して()
と同形であり、()
に値が1つしかないことを示しているので、タイプはid
でなければなりません。ハスケル型に唯一の関数が存在することをどのように示しますか?
米田は言う:まとめ、彼の証明は、このようなものです
a =()
とf = Identity
場合Functor f => (forall b . (a -> b) -> f b) ~ f a
、これは次のようになります。
(forall b. (() -> b) -> b) ~()
そして自明
() -> b ~ b
以来、LHSは基本的にタイプですid
です。
これは、id
でうまくいく「マジックトリック」のような感じです。私はより複雑な関数型のために同じことをしようとしています:
(b -> a) -> (a -> b -> c) -> b -> c
しかし、どこから始めたらいいのか分かりません。 \f g x = g (f x) x
が住んでいることを知っています。醜い⊥
/undefined
のものを無視すると、このタイプの他の機能はありません。
私はガブリエルのトリックはすぐに私は種類を選ぶ方法を適用するとは思わない。このタイプと同型の同型性を示すことができる他のアプローチ(これは正式な形式です)は()
ですか?
ああ、私はカリングを使って '((a、b) - > c)'を得ることを考えていましたが、引数の順番を入れ替えるのではなく、何とかトリックでした! – Lynn
'' a''ではなく '' a - > b - > c - > b - > c'' '((a、b) - > c)の代わりに' f'を共変なホームファンクタにすることもできます。 - >( - >)bc'〜 'b->(a、b)'である。 – user3237465
あなたは 'forall b a。 (b - > a) - > b - >すべてのc。 (a - > b - > c) - > c '型で、それぞれの' forall'のスコープは明示的に見えますか? –