6

GHC 警告我没有顶层的函数签名。我不明白为什么我需要它们。提供它们的问题是它们非常复杂,就像这个(自动生成的):

applyValue :: forall t t1 t2 t3 t4.
                (t2 -> t)
                -> (t2 -> t3 -> t4 -> t1) -> t2 -> t3 -> t4 -> (t -> Bool) -> [t1]

那么我为什么要费心添加它们呢?

函数本身:

applyValue getValueAt stitchAndMove at fabric mark matchAt =
   if matchAt (getValueAt at)
   then [stitchAndMove at fabric mark]
   else []
4

1 回答 1

22
  • 作为机器可检查文档的一种形式。如果您认为该类型是正确的类型,则将其放在那里会要求编译器在以后不可避免的重构会话中仔细检查您是否没有使用自己的接口。
  • 作为人类可读的文档。尽管正如您所观察到的,当您注意到您正在编写一个糟糕的机器生成类型时,可能是时候考虑需要哪些(类型级别的)抽象来使其具有人类可读性。
  • 对于黑线鳕。Haddock 注释附加到类型签名,而不是绑定,因此如果您遗漏类型签名,您精心手写的文档将被默默忽略。
  • 为了改进错误消息和 ghci 查询结果:尽管类型变量的实际名称并不重要,但当用户提供名称时,GHC 会努力保留名称。类似的东西(node -> Bool) -> (edge -> Bool) -> (graph -> Bool)可能比 更具可读性(t1 -> Bool) -> (t2 -> Bool) -> (t3 -> Bool),即使它们是等价的。
于 2013-10-28T03:39:51.760 回答