我的问题是如何分析处理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具有上述签名的类型?什么是"代数",如果这是正确的词,使用类型签名的规则?我怎么能"展示我的作品"?
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的类型签名,变量替换就像您期望的那样工作.事实上,类型和代数之间的直接翻译.