如何在我的haskell代码中更正此错误:

时间:2014-07-01 07:45:37

标签: haskell

我有一个代码:

module Task5 where

import Prelude

data Stream a = a :& Stream a

infixl 4 :&

add :: Num a => a -> a -> a
add a b = a + b

instance  Num a => Num (Stream a ) where
    (+) (ia:&a) (ib :& b) = (ia + ib) :& ((+) a b)

    (-) (ia :& a) (ib :& b) = ((-) ia ib) :& (-) a b
    (*) (ia :& a) (ib :& b) = ((*) ia ib) :& (*) a b
    negate (i1 :& a) = negate i1 :& negate a
    abs (i1 :& a) = abs i1 :& abs a
    signum (i1 :& a) = signum i1 :& signum a
    fromInteger (i1 :& a) = fromInteger i1 :& fromInteger a

并出现2错误:

Task5.hs:20:18:
    Couldn't match expected type `Integer'
                with actual type `Stream Integer'
    In the pattern: i1 :& a
    In an equation for `fromInteger':
        fromInteger (i1 :& a) = fromInteger i1 :& fromInteger a
    In the instance declaration for `Num (Stream a)'

Task5.hs:20:59:
    Couldn't match expected type `Integer'
                with actual type `Stream Integer'
    In the first argument of `fromInteger', namely `a'
    In the second argument of `(:&)', namely `fromInteger a'
    In the expression: fromInteger i1 :& fromInteger a
Failed, modules loaded: none.

我不明白如何纠正这个问题,所以如何纠正这个问题?))你可以建议我阅读学习haskell?

1 个答案:

答案 0 :(得分:3)

fromInteger的类型是

Num a => Integer -> a

所以它用于将Integer转换为您的Num类型。因此fromInteger的第一个参数应为Integer,但在您的实现中:

fromInteger (i1 :& a) = fromInteger i1 :& fromInteger a

Stream

一种可能的实现方式是创建一个无限的转换整数值流,例如

fromInteger i = (fromInteger i) :& (fromInteger i)