在haskell

时间:2017-06-06 15:45:59

标签: haskell

我在定义函数类型时遇到问题。在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

提前致谢

2 个答案:

答案 0 :(得分:4)

Haskell是一种静态类型语言。这意味着返回类型依赖于输入的

一个想法可能是使用fromIntegral :: (Integral a, Num b) => a -> bInt转换为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