【发布时间】:2011-03-26 22:26:04
【问题描述】:
我目前正在学习 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 年之后的一年内计算该年的估计人口,现在它工作正常,除了你可能已经注意到每个数字都被转换为浮点数。现在这样做非常荒谬,因为没有理由将当前人口,一年中的秒数或年份本身作为整数以外的任何东西,不幸的是,尽管当我以这种方式拥有它时,我得到了编译器/ 函数说有关小数 int 的错误,* 函数说它推断出浮点数作为第一个参数。现在我已经明白,当遇到涉及整数和浮点数的操作时,Haskell 像其他语言一样只会将 int 更改为像浮点数一样,这显然不会在这里发生。有人可以解释为什么我会遇到这些错误,以及我如何让整数和浮点数进行合作,因为显然我对 Haskell 类型系统的掌握还不够好,无法自己完成?
【问题讨论】: