我目前正在學習Haskell,並一直在編寫幾個非常簡單的程序來練習。其中一項方案是一個我怒吼:Haskell數據類型轉換問題
import System.IO
main = do
putStrLn "Give me year: "
y <- getLine
let res = show . calcPop $ read y
putStrLn ("Population in " ++ y ++ " will be " ++ res)
pop :: Float
pop = 307357870.0
secInYear :: Float
secInYear = 365.0 * 24.0 * 60.0 * 60.0
bRate :: Float
bRate = secInYear/7.0
dRate :: Float
dRate = secInYear/13.0
iRate :: Float
iRate = secInYear/35.0
calcPop :: Float -> Float
calcPop year = let years = year - 2010 in (years*bRate + years*iRate + pop - years*dRate)
它什麼是需要2010年後並於當年計算估計的人口,而且因爲它是現在它工作正常,所有不同的是如你可能已經注意到每個單個數字都被當作一個浮點數。現在做這件事非常荒謬,因爲沒有理由擁有當前的人口數量,一年中的秒數或一年中的秒數,除此之外,不幸的是,當我擁有這種方式時,我得到了編譯器/
函數錯誤地提供了關於小數整數的函數以及*
函數說明它將浮點數推斷爲第一個參數。現在我已經理解Haskell像其他語言一樣,遇到涉及int和float的操作時只會改變int的行爲,就像在這裏沒有發生的float一樣。有人能解釋爲什麼我會得到這些錯誤,以及我如何能夠通過合作和浮動來進行合作,因爲顯然我還沒有很好地掌握Haskell類型系統來自己做這件事。