簡體   English   中英

為什么我的頂級函數需要在Haskell中簽名?

[英]Why do my top level functions need signatures in Haskell?

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 []
  • 作為機器可檢查文檔的一種形式。 如果您認為該類型是正確的類型,那么將它放在那里要求編譯器仔細檢查您在以后不可避免的重構會話期間是否沒有使用自己的接口。
  • 作為人類可讀的文檔。 雖然正如你所觀察到的那樣,當你注意到你正在編寫一個糟糕的機器生成類型時,可能是時候考慮一​​下你需要什么(類型級)抽象來使它具有人類可讀性。
  • 對於黑線鱈。 Haddock注釋附加到類型簽名,而不是綁定,因此如果省略類型簽名,您將仔細忽略您的精心手寫的文檔。
  • 要改進錯誤消息和ghci查詢結果:雖然類型變量的實際名稱無關緊要,但GHC會在用戶提供名稱時努力保留名稱。 (node -> Bool) -> (edge -> Bool) -> (graph -> Bool)可以比(t1 -> Bool) -> (t2 -> Bool) -> (t3 -> Bool)更可讀(t1 -> Bool) -> (t2 -> Bool) -> (t3 -> Bool) ,即使它們是等同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM