我在定义函数类型时遇到问题。在1,10,11和12的情况下,我插入一个Int并返回一个浮点数,但在我插入一个Int并返回一个Int的情况下,类型并不匹配。 我试过了 pointsForSeventy :: Int-> Float以及pointsForSeventy :: Real a-> Int-> a(我认为这个可行,因为积分和分数在实数内)
pointsForSeventy 1 = 5.5
pointsForSeventy 10 = 0.5
pointsForSeventy 11 = 0.5
pointsForSeventy 12 = 0.5
pointsForSeventy a = a
提前致谢
答案 0 :(得分:4)
Haskell是一种静态类型语言。这意味着返回类型不依赖于输入的值。
一个想法可能是使用fromIntegral :: (Integral a, Num b) => a -> b
将Int
转换为Float
:
pointsForSeventy :: Int -> Float
pointsForSeventy 1 = 5.5
pointsForSeventy 10 = 0.5
pointsForSeventy 11 = 0.5
pointsForSeventy 12 = 0.5
pointsForSeventy a = fromIntegral a
如果您希望将Int
案例视为与Float
案例不同,您还可以使用Either
:
pointsForSeventy :: Int -> Either Float Int
pointsForSeventy 1 = Left 5.5
pointsForSeventy 10 = Left 0.5
pointsForSeventy 11 = Left 0.5
pointsForSeventy 12 = Left 0.5
pointsForSeventy a = Right a
答案 1 :(得分:3)
您需要一个明确的转换:
pointsForSeventy 1 = 5.5
pointsForSeventy 10 = 0.5
pointsForSeventy 11 = 0.5
pointsForSeventy 12 = 0.5
pointsForSeventy a = fromIntegral a
与其他几种编程语言不同,Haskell永远不会自动执行数值类型之间的自动或隐式转换。
另一方面,数字文字属于任何数字类型。例如。 1/2*0.5 :: Double
将返回0.25
,因为所有三个文字都是Double
。在某些语言(例如C)中,1/2*0.5
的计算结果为0
,因为1/2
是整数除法(!),并且计算结果为0
。