我有一个代码:
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?
答案 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)