gpt4 book ai didi

haskell - 简化 Haskell 类型签名

转载 作者:行者123 更新时间:2023-12-02 11:59:53 26 4
gpt4 key购买 nike

我的问题是关于如何分析使用 Haskell 类型签名。为了具体起见,我正在研究“修复”功能:

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

还有我编写的一个小函数,用于执行 Peano 风格的加法:

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应用于add时,fix的签名变为

修复::((a -> a -> a) -> (a -> a -> a)) -> (a -> a -> a)

请记住,fix::(a -> a) -> a 中的 a 可以具有任何类型。在本例中,它们的类型为 (a -> a -> a)

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

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

关于haskell - 简化 Haskell 类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17797561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com