Haskell数据类型转换问题

use*_*261 2 haskell types

我正在学习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)
Run Code Online (Sandbox Code Playgroud)

它的作用是在2010年之后花一年时间计算当年的估计人口数量,现在它正常工作并且除了你可能已经注意到的所有单个数字被投射为浮点数以外的所有人.现在这样做是非常荒谬的,因为没有理由让当前的人口,一年或一年中的秒数本身就不算什么,不幸的是,虽然当我这样做时我得到了编译器/函数的错误说明了一些关于小数int的*函数,并且函数说它推断了一个浮点数作为第一个参数.现在我已经理解Haskell在遇到涉及int和float的操作时会像其他语言一样只会改变int,就像浮动一样,这里并没有发生过.有人可以解释为什么我会得到这些错误以及如何获得整合和浮动合作,因为显然我仍然没有足够好地掌握Haskell类型系统来自己做这件事吗?

gee*_*aur 9

Haskell类型是严格的; 它永远不会自动为您转换类型,除了整数文字自动包装fromIntegral.相反,你可能需要使用更多类型适当的操作,例如`div`,当你只需要处理Int/ Integer,并fromIntegral以促进FloatDouble需要时.

(语法注释: `function`将前缀函数转换为中缀运算符.)