简化Haskell类型签名

Chr*_*ris 4 haskell types

我的问题是如何分析处理Haskell类型签名.为了使它具体化,我正在寻找"修复"功能:

fix :: (a -> a) -> a
Run Code Online (Sandbox Code Playgroud)

还有一个小编的功能,我写的做Peano-ish的补充:

add = \rec a b -> if a == 0 then b else rec (a-1) (b+1)
Run Code Online (Sandbox Code Playgroud)

当我检查类型时,我得到了我期望的类型fix add:

fix add :: Integer -> Integer -> Integer
Run Code Online (Sandbox Code Playgroud)

它似乎像我期望的那样工作:

> (fix add) 1 1
2
Run Code Online (Sandbox Code Playgroud)

如何使用类型签名fix以及add显示fix add具有上述签名的类型?什么是"代数",如果这是正确的词,使用类型签名的规则?我怎么能"展示我的作品"?

cdk*_*cdk 8

ghci 告诉我们

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

modulo一些类型类噪声,因为第二个参数add需要一个Eq实例(你要检查它是否相等0)

在申请fix的时候add,签名fix变成

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

请记住,as in fix :: (a -> a) -> a可以有任何类型.在这种情况下,他们有类型(a -> a -> a)

因此fix add :: Num a => a -> a -> a,这是添加两个as 的正确类型.

您可以以非常代数的方式使用Haskell的类型签名,变量替换就像您期望的那样工作.事实上,类型和代数之间的直接翻译.

  • @ twopoint718将`fix`应用于`add`会从`fix`的类型中删除`((a - > a - > a) - >(a - > a - > a))`参数. (3认同)