[英]Simplify Haskell Type Signatures
我的问题是如何分析处理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
如何使用类型签名进行fix
和add
以显示fix add
具有上述签名? 什么是“代数”,如果这是正确的词,使用类型签名的规则? 我怎么能“展示我的作品”?
ghci
告诉我们
add :: Num a => (a -> a -> a) -> a -> a -> a
模拟一些类型类噪声,因为要add
的第二个参数需要一个Eq
实例(你要检查它与0
相等性)
当我们应用fix
add
, fix
的签名变为
fix :: ((a -> a -> a) -> (a -> a -> a)) -> (a -> a -> a)
记住, fix :: (a -> a) -> a
的a
fix :: (a -> a) -> a
可以有任何类型。 在这种情况下,他们有类型(a -> a -> a)
因此fix add :: Num a => a -> a -> a
,而这正是添加两个正确的类型a
秒。
您可以以非常代数的方式使用Haskell的类型签名,变量替换就像您期望的那样工作。 事实上,类型和代数之间的直接翻译 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.