为什么在 where 子句中使用类型签名如此罕见?

2024-05-21

它是否有助于编译器优化,或者只是添加额外类型签名的多余工作?例如,人们经常看到:

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(使用前将#替换为@)

为什么在 where 子句中使用类型签名如此罕见? 的相关文章

随机推荐