gpt4 book ai didi

haskell - Haskell 什么时候需要类型签名?

转载 作者:行者123 更新时间:2023-12-03 11:07:49 25 4
gpt4 key购买 nike

许多介绍性文本会告诉您,在 Haskell 中,类型签名“几乎总是”是可选的。任何人都可以量化“几乎”部分吗?

据我所知,唯一需要显式签名的时候是消除类型类的歧义。 (典型的例子是 read . show 。)还有其他我没有想到的情况,或者是这样吗?

(我知道,如果您超越 Haskell 2010 会有很多异常(exception)。例如,GHC 永远不会推断 rank-N 类型。但是 rank-N 类型是一种语言扩展,不是官方标准的一部分[尚未]。 )

最佳答案

一般来说,多态递归需要类型注释。

f :: (a -> a) -> (a -> b) -> Int -> a -> b
f f1 g n x =
if n == (0 :: Int)
then g x
else f f1 (\z h -> g (h z)) (n-1) x f1

(来源:帕特里克·库索)

注意递归调用看起来是错误的类型(!):它用五个参数调用自己,尽管 f只有四个!然后记住 b可以用 c -> d 实例化,这会导致出现额外的参数。

上面设计的示例计算
f f1 g n x = g (f1 (f1 (f1 ... (f1 x))))

在哪里 f1已应用 n次。当然,还有一种更简单的方法来编写等效程序。

关于haskell - Haskell 什么时候需要类型签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27067905/

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