types - 为什么要在 Haskell 中编写类型声明?

标签 types type-inference haskell

我是 Haskell 的新手,我试图理解为什么需要编写类型声明。由于 Haskell 有类型推断,我什么时候需要第一行? GHCI 似乎使用我使用 ':t' 生成正确的输出

到目前为止,我发现的唯一一个似乎需要声明的例子如下。

maximum' :: (Ord a) => [a] -> a  
maximum' = foldr1 max

但是,如果我添加“-XNoMonomorphismRestriction”标志声明就不再需要了。是否存在类型推断不起作用并且需要指定类型的特定情况?

因为我可能在类型声明中有一个错误并且没有直接的好处,所以我宁愿不写它。同样,我刚刚开始学习 Haskell,所以如果我错了,请纠正我,因为我想养成良好的习惯。

编辑:事实证明 Type inference is a double-edged sword Real World Haskell 的部分这本书对这个话题有很好的讨论。

最佳答案

  • 当您有大型 Haskell 程序时,具有类型签名通常会为您提供来自编译器的更好的错误消息
  • 有时您可以从函数的名称和签名
  • 中得出函数的作用。
  • 通常使用类型签名可以更好地理解函数,例如如果你使用柯里化(Currying)
  • 即使编写程序变得更容易,我也经常从类型签名和大多数声明为 undefined 的函数开始.一切都编译好了,我知道我的想法似乎还不错。然后我继续替换undefined通过真实代码
  • 关于types - 为什么要在 Haskell 中编写类型声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6246521/

    相关文章:

    f# - F#在实际处理int64时假设int

    haskell - 如何检测 Haskell Pipe 中的最后一个 block ?

    haskell - GHC : Why does type ambiguity go away when using let

    javascript - 是否可以在 TypeScript 中创建 "weak export"

    haskell - Haskell中是否有未标记联合类型的编译器扩展?

    函数返回函数时的 TypeScript 类型推断问题

    haskell - LT 和 GT 是什么意思?

    python - 使用 `is (CustomClass)` 可以安全地检测 Python 中的未初始化值

    haskell - 使用 UndecidableInstances 可以吗?备择方案?

    ios - 为什么 Swift 推断出元类型 'Any.Type' 而不是类型 'Any' ?