[英]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
以及你對它的使用。 是的, k
和foo
應該是一樣的但是bar
確實有點不同,就像你在這里寫的那樣。
foo
應該是顯而易見的(我希望)(只是*
是多態的,類型只是說) bar
,那是因為在x
左側上沒有使用right
一邊讓你獲得額外的參數t
-這是同bar y = \\x -> x * x
k
請參閱Monomorphism限制 - 基本上Haskell將在此處提取默認類型以解決可能出現的一些輕微問題。 你在這里得到它有點奇怪,因為默認情況下較新的GHCi版本不應該顯示這種行為(參見鏈接) 順便說一句:不要太在意這些類型的名字;)
所吸取的教訓應該是寫下您的簽名(至少在頂級函數上)^^ - 它會解決您的所有問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.