它是否有助于编译器优化,或者只是添加额外类型签名的多余工作?例如,人们经常看到:
foo :: a -> b
foo x = bar x
where bar x = undefined
而不是:
foo :: a -> b
foo x = bar x
where bar :: a -> b
bar x = undefined
如果我省略了顶级类型签名,GHC 会给我一个警告,所以如果我没有收到警告,我非常有信心我的程序是正确的。但如果我省略 where 子句中的签名,则不会发出警告。
存在一类局部函数,其类型无法用 Haskell 编写(即不使用花哨的 GHC 扩展)。例如:
f :: a -> (a, Int)
f h = g 1
where g n = (h, n)
这是因为虽然a
in the f
从外部看类型签名是多态的f
,从内部来看并非如此f
. In g
,这只是some未知类型,但不是any类型,并且(标准)Haskell 无法在其类型语言中表达“与定义该函数的第一个参数相同的类型”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)