【发布时间】:2018-03-09 09:28:36
【问题描述】:
data Tick = Tick
{ _price :: Int
, _timestamp :: TimeOfDay
} deriving (Eq, Ord)
instance Num Tick where
(-) (Tick a b) (Tick a' _) = Tick (a - a') b
calcAxis :: High -> Low -> Int
calcAxis (Just (Tick a _)) (Just (Tick b _)) = (fromIntegral (a - b)) / 2
我知道划分Int 会产生Float,所以我需要在使用fromIntegral 之前使用Int 转换(/) 但是我仍然得到错误:
• No instance for (Fractional Int) arising from a use of ‘/’
• In the expression: (fromIntegral (a - b)) / 2
In an equation for ‘calcAxis’:
calcAxis (Just (Tick a _)) (Just (Tick b _))
= (fromIntegral (a - b)) / 2
我真的不明白它要我做什么。当然我不必为Fractional Int 定义一个实例?
我认为我做错了什么。
【问题讨论】:
-
如果我理解正确,错误消息是在抱怨整个表达式
(fromIntegral (a - b)) / 2— 这是 Fractional,但您已经询问(通过calcAxis的类型签名)它是 @ 987654331@. -
如果我删除除法并更新
calcAxis的签名以返回Float,则类型检查正常。 -
@Globalkeith:你为什么要两者都做?更新签名以返回
Float并且不要删除除法。 -
Doh,忽略我 - 它会在返回
Float时进行类型检查!谢谢 -
是的,将结果保留为小数类型可能是正确的。虽然
Float在 Haskell 中很不寻常,但通常更高精度的Double或精确的Rational是首选。
标签: haskell