2016-01-20 124 views
0

我想學習Haskell的指導學習你一個Haskell,但以下困惑我。Haskell函數模式匹配

lucky :: (Integral a) => a -> String 
lucky 7 = "LUCKY NUMBER SEVEN!"   
lucky x = "Sorry, you're out of luck, pal!" 

正如你所看到的,這裏有一行說明函數的確切類型。但這是必要的嗎?參數和返回值的類型不能從該行下面的模式中推導出來嗎?

+1

相關:https://stackoverflow.com/questions/27067905/when-are-type-signatures-necessary-in-haskell – Zeta

回答

6

你是對的,他們絕對沒有必要。然而,至少有兩個原因說明函數的類型是非常普遍的做法:至少有兩個原因:

  • 告訴編譯器你究竟是什麼意思。如果您在編寫函數時出錯,編譯器將不會推斷出錯誤類型,但會警告您錯誤
  • 告訴閱讀代碼的人。無論如何,在理解代碼的時候,他們必須找出函數的類型,所以你可以讓它們更容易。使類型顯式使代碼更具可讀性。

這就是爲什麼,雖然它們是可選的,但頂級函數的類型幾乎總是在Haskell代碼中拼寫出來。


要完成Zeta所說的,在這種情況下沒有必要。但是,在某些情況下,當代碼過於模糊而無法推斷時,有必要指定函數的類型。

+0

該行是否生成實際的代碼(就像一些運行時類型檢查?我完全是新手Haskell ..) –

+0

你應該讀它作爲編譯器的提示(它可能會或可能不會改變生成的代碼基於這些提示) - 如果你不給它,編譯器會試圖推斷它 – Carsten

+0

*「你是對,他們絕對沒有必要。「*在這個案件中。在幾種情況下,如果您離開類型簽名並吐出幾頁不明確的錯誤,GHC會對您大吼一聲。 – Zeta

-2

出於文檔目的,並且因爲對於某些類型的擴展,自動推斷失敗。閱讀here

+2

1.鏈接中斷。目前,你的答案几乎只是一個鏈接的答案。將更多信息添加到答案中。 – Zeta

+0

@Zeta 2同意,但1個鏈接並沒有被打破。 –

+0

@JohnsonSteward:忍者在前五分鐘內編輯。 – Zeta