簡體   English   中英

在Haskell中鍵入函數的簽名

[英]Type signature of functions in Haskell

我在haskell中定義了三個函數,它們將兩個數相乘

k = \x y -> x * y

foo y = \x -> x * y

bar x = \x -> x * x

但是我為這三個功能獲得了不同的簽名。

λ> :t k
k :: Integer -> Integer -> Integer
λ> :t foo
foo :: Num a => a -> a -> a
λ> :t bar
bar :: Num a => t -> a -> a

有人可以解釋為什么會這樣嗎? 我可以在酒吧的類型簽名中看到。 它是否與a,b或a1,a2等的正常使用不同

第一個:所有的簽名基本上來自(*) :: Num a => a -> a -> a以及你對它的使用。 是的, kfoo應該是一樣的但是bar確實有點不同,就像你在這里寫的那樣。

  • foo應該是顯而易見的(我希望)(只是*是多態的,類型只是說)
  • bar ,那是因為在x左側上沒有使用right一邊讓你獲得額外的參數t -這是同bar y = \\x -> x * x
  • 對於k請參閱Monomorphism限制 - 基本上Haskell將在此處提取默認類型以解決可能出現的一些輕微問題。 你在這里得到它有點奇怪,因為默認情況下較新的GHCi版本不應該顯示這種行為(參見鏈接)

順便說一句:不要太在意這些類型的名字;)

所吸取的教訓應該是寫下您的簽名(至少在頂級函數上)^^ - 它會解決您的所有問題

暫無
暫無

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

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