gyok
gyok

Reputation: 5

How to correct this error in my haskell code:

i Have a code:

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

and have a 2 error:

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.

I dont understand how to correct this problem, so How correct this problem?)) And what you can advise me to read for learning haskell?

Upvotes: 0

Views: 122

Answers (1)

Lee
Lee

Reputation: 144136

The type of fromInteger is

Num a => Integer -> a

so it is for converting an Integer into your Num type. The first argument to fromInteger should therefore be an Integer, however in your implementation:

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

it is a Stream.

One possible implementation would be to create an infinite stream of converted integer values e.g.

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

Upvotes: 3

Related Questions