繁体   English   中英

简化Haskell类型签名

[英]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

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

ghci告诉我们

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

模拟一些类型类噪声,因为要add的第二个参数需要一个Eq实例(你要检查它与0相等性)

当我们应用fix addfix的签名变为

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM