4

私の質問は、Haskell 型の署名を分析的に扱う方法についてです。具体的にするために、「修正」機能を見ています。

fix :: (a -> a) -> a

そして、ペアノっぽい追加を行うために私が書いたちょっとした作りの関数:

add = \rec a b -> if a == 0 then b else rec (a-1) (b+1)

タイプを調べると、期待されるタイプが得られますfix add

fix add :: Integer -> Integer -> Integer

そして、それは私が期待するように動作するようです:

> (fix add) 1 1
2

fix上記のシグネチャを持つ型シグネチャ forおよび foraddを使用して表示するにはどうすればよいfix addですか? 型シグネチャを扱うための「代数的」ルールとは何ですか? どうすれば「自分の作品を見せる」ことができますか?

4

1 に答える 1

8

ghci教えてくれます

add :: Num a => (a -> a -> a) -> a -> a -> a

addの2番目の引数がインスタンスを必要とするため、いくつかの型クラスノイズをモジュロしEqます( との等価性をチェックしています0

に申請fixする場合add、 の署名は次のようにfixなります。

fix :: ((a -> a -> a) -> (a -> a -> a)) -> (a -> a -> a)

aのsは任意のfix :: (a -> a) -> aを持つことができることに注意してください。この場合、それらはタイプを持っています(a -> a -> a)

したがってfix add :: Num a => a -> a -> a、これは 2 つの を追加するのに正確なタイプaです。

Haskell の型シグネチャを非常に代数的な方法で扱うことができ、変数置換は期待どおりに機能します。実際、型と代数の間には直接的な翻訳があります。

于 2013-07-22T21:56:44.660 に答える