你好我是Haskell的新手,我遇到了问题。
我想创建一个对Partida有效的方法以及Partidas(Facturas)列表,我们有这样的代码:
data Bebida a b where {
Bebida::(Integral a, Fractional b)=>{codigo::a, nombre::[Char], precio::b } -> Bebida a b
}
data Partida a b c where {
ParMult:: (Integral a, Integral c, Fractional b) => {cantidad::c, bebida::Bebida a b} -> Partida a b c;
ParUnit:: (Integral a, Integral c, Fractional b) => {bebida::Bebida a b} -> Partida a b c
}
type Factura a b c = [Partida a b c]
class Preciable a where
precioe :: (Fractional d) => a -> d
instance (Integral a, Fractional b, Integral c) => Preciable (Partida a b c) where
precioe (ParMult n b) = (fromIntegral(n)*(precio b))
precioe (ParUnit b) = (precio b)
instance (Integral a, Integral c, Fractional b, Eq b) => Preciable (Factura a b c) where
precioe f = sum [precioe x | x<-f]
我不知道为什么要给我这个错误。任何人都可以帮我告诉我为什么Haskell会给我这个错误?
感谢您的帮助!!
答案 0 :(得分:3)
问题是precioe
应该返回任何Fractional
d
(Double
,Rational
等。 precioe
的来电者可以决定它是什么。
Preciable
的实例返回Fractional
(b
)的内容,但不一定是Fractional
的调用方想要的precioe
({{ 1}})。幸运的是,有一种方法可以使用d
Fractional
号d
您可以使用fromRational :: Fractional d => Rational -> d
课程将b
变为Rational
:
Real
有一个功能结合了这两个功能,它还使用重写规则来加快某些类型之间的转换:
class (Num a, Ord a) => Real a where
toRational :: a -> Rational
向realToFrac :: (Real a, Fractional b) => a -> b
realToFrac = fromRational . toRational
添加Real
约束可让您使用b
编写实例:
realToFrac