4

我的问题是关于如何分析地使用 Haskell 类型签名。具体来说,我正在查看“修复”功能:

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

和一个我写的做Peano-ish加法的小函数:

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

我如何使用 forfix和 for的类型签名add来显示fix add具有上述签名的?什么是“代数”,如果这是正确的词,那么使用类型签名的规则是什么?我怎么能“展示我的作品”?

4

1 回答 1

8

ghci告诉我们

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

对一些类型类噪声取模,因为 to 的第二个参数add需要一个Eq实例(您正在检查它是否与 相等0

当我们申请fix时,add签名为fix

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

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

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

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

于 2013-07-22T21:56:44.660 回答