无法将预期类型d与实际类型b匹配

时间:2016-10-24 14:38:47

标签: haskell types typeclass

你好我是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会给我这个错误?

感谢您的帮助!!

1 个答案:

答案 0 :(得分:3)

问题是precioe应该返回任何Fractional dDoubleRational等。 precioe的来电者可以决定它是什么。

Preciable的实例返回Fractionalb)的内容,但不一定是Fractional的调用方想要的precioe({{ 1}})。幸运的是,有一种方法可以使用d

创建任何Fractionald

您可以使用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