我試圖圍繞Haskell類型強制包裹我的頭。意思是什麼時候可以將一個值傳遞給一個函數而不需要投射以及它是如何工作的。這裏是一個具體的例子,但我在尋找我可以用前進,試圖瞭解正在發生的事情更一般的解釋是:Haskell類型強制
Prelude> 3 * 20/4
15.0
Prelude> let c = 20
Prelude> :t c
c :: Integer
Prelude> 3 * c/4
<interactive>:94:7:
No instance for (Fractional Integer)
arising from a use of `/'
Possible fix: add an instance declaration for (Fractional Integer)
In the expression: 3 * c/4
In an equation for `it': it = 3 * c/4
的類型(/)是分數A => A - > a - > a。所以,我猜測,當我使用文字做「3 * 20」時,Haskell以某種方式假定該表達式的結果是分數。但是,如果使用變量,則根據賦值將類型預定義爲Integer。
我的第一個問題是如何解決這個問題。我需要轉換表達式還是以某種方式轉換它? 我的第二個問題是,對於我來說,這看起來很奇怪,因爲如果不用擔心int/float類型的問題,就無法進行基本的數學運算。我的意思是有一個顯而易見的方法可以在這些之間自動轉換,爲什麼我不得不考慮這個並處理它?我開始做錯了什麼?
我基本上正在尋找一種方法來輕鬆地編寫簡單的算術表達式,而不必擔心整潔的偉大的細節,並保持代碼的漂亮和乾淨。在大多數頂級語言中,編譯器爲我工作 - 而不是相反。
快速提示:請嘗試在源文件中執行此操作,而不是直接在GHCi中執行此操作。它會以這種方式爲你提供更多的東西,因爲它可以查看整個程序,而不是一次處理一行。 –
這個問題是基於一個不起作用的整個程序。我已經隔離了編譯器正在抱怨的這個特定部分。我可以發佈整個事情,但我認爲它不會有多大幫助。 – oneself
你的問題已被回答,但是:「有一種明顯的方法可以在這些之間自動轉換。」有真的嗎?當我想要一個'Double',或者甚至是一個'Int64'時,'2^128 :: Integer'應該自動變成什麼?當然,由於四捨五入,從非整數類型到整數類型不可能是自動的。一般來說,Haskell沒有子類型或自動類型強制;它具有(約束)參數多態性。但是一旦一個類型變成具體/單形的,那個類型的值就只有*這種類型。 –