Haskell数据类型转换问题

Haskell数据类型转换问题,haskell,types,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 :: Flo

我目前正在学习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)
import System.IO
main=do
putStrLn“给我一年:”
y形浮球
calcPop年=让年=年-2010年(年*小鬼+年*愤怒+流行年*德拉特)

它所做的是在2010年后的一年,计算这一年的估计人口,现在它运行良好,除了你可能已经注意到的每一个数字都是浮点数。现在这样做是非常荒谬的,因为没有理由将当前人口、一年中的秒数或一年本身视为整数以外的任何东西,不幸的是,当我这样做时,
/
函数表示分数int,而
*
函数表示它推断出一个浮点作为第一个参数,这导致了编译器错误。现在我明白了,Haskell和其他语言一样,当遇到涉及int和float的操作时,只会将int更改为类似于float的行为,而这在这里是不可能发生的。有人能解释一下为什么我会出现这些错误,以及我如何让整数和浮点进行合作,因为显然我对Haskell类型的系统还没有足够的掌握,无法自己去做吗?

Haskell类型是严格的;它不会自动为您转换类型,除非整数文本自动包装在
from integral
中。相反,当您只需要处理
Int
/
Integer
时,您可能希望使用更适合类型的操作,例如
`div`
,以及
从integral
升级到
Float
Double
(需要时)


(语法说明:
`function`
将前缀函数转换为中缀运算符。)

对于Haskell中的整数除法,可以使用以下命令中的
div
quot

整数文本表示 函数的应用 从整数到适当的值 类型为整数。类似地,一个浮动的 point literal代表一个 fromRational在一个值中的应用 类型为Rational(即比率 整数)

这意味着源代码中的“7”变为“(fromInteger 7)”,而“1.5”变为“(fromRational(3比率。%2))”。像(+)和(/)这样的数字运算具有像“a->a->a”这样的类型签名,这意味着它们有两个类型完全相同的参数,并返回给定的相同类型。这些标准运算符永远不能执行将浮点添加到Int的操作。您可以编写(fromIntegral)来尝试将类似Int的类型升级为类似Double或Float的类型