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

如何在我的haskell代码中更正此错误:,haskell,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) :& ((+

我有一个密码:

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?

fromInteger的
类型是

Num a => Integer -> a
因此,它用于将
整数
转换为
Num
类型。因此,
fromInteger
的第一个参数应该是
整数,但是在您的实现中:

fromInteger (i1 :& a) = fromInteger i1 :& fromInteger a
它是一个

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

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

fromInteger的
类型为

Num a => Integer -> a
因此,它用于将
整数
转换为
Num
类型。因此,
fromInteger
的第一个参数应该是
整数,但是在您的实现中:

fromInteger (i1 :& a) = fromInteger i1 :& fromInteger a
它是一个

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

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

fromInteger的
类型为

Num a => Integer -> a
因此,它用于将
整数
转换为
Num
类型。因此,
fromInteger
的第一个参数应该是
整数,但是在您的实现中:

fromInteger (i1 :& a) = fromInteger i1 :& fromInteger a
它是一个

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

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

fromInteger的
类型为

Num a => Integer -> a
因此,它用于将
整数
转换为
Num
类型。因此,
fromInteger
的第一个参数应该是
整数,但是在您的实现中:

fromInteger (i1 :& a) = fromInteger i1 :& fromInteger a
它是一个

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

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


fromInteger的类型为Integer->a,因此它的参数应该是整数,而不是流。它用于将整数转换为num实例。“那么您可以建议我读些什么来学习haskell?”,最重要的是:在遇到错误时读取您正在使用的函数的签名。fromInteger的类型为integer->a,因此它的参数应该是整数,而不是流。它用于将整数转换为num实例。“那么您可以建议我读些什么来学习haskell?”,最重要的是:在遇到错误时读取您正在使用的函数的签名。fromInteger的类型为integer->a,因此它的参数应该是整数,而不是流。它用于将整数转换为num实例。“那么您可以建议我读些什么来学习haskell?”,最重要的是:在遇到错误时读取您正在使用的函数的签名。fromInteger的类型为integer->a,因此它的参数应该是整数,而不是流。它用于将整数转换为num实例。“您能建议我读些什么来学习haskell?”,最重要的,但最重要的是:当您遇到错误时,请阅读您正在使用的函数的签名。@gyok您希望您的
fromInteger
方法做什么?您似乎希望它获取一个流,并对其每个元素执行底层num类型的
fromInteger
操作。正如Lee所说,您不能这样做,因为
fromInteger
接受一个整数。所以你可以通过让
fromInteger
做一些其他的事情来“修复”它,这些事情实际上是对一个整数进行操作的。是的,anderstand,但我想知道流是否有整数元素,比如(5&:6&:7…)fromInteger可以处理it@gyok问题是:当用户编写类似于
42::Stream Int
的内容时,您希望发生什么?此时将调用
fromInteger
(Integer
42
作为参数)。类似于
fromInteger(5&:6&:7…)
将不合法,因为
fromInteger
的参数始终是一个整数。@gyok-我添加了一个可能的实现。我可以建议用
fromInteger I=keepGoing手动打结,其中
singleValue=fromInteger I
keepGoing=singleValue:&keepGoing
,避免重新评估
(来自整数i)
。(最后一行中不需要括号。)@gyok您想让
fromInteger
方法做什么?您似乎希望它获取一个流,并对其每个元素执行底层num类型的
fromInteger
操作。正如Lee所说,您不能这样做,因为
fromInteger
接受一个整数。所以你可以通过让
fromInteger
做一些其他的事情来“修复”它,这些事情实际上是对一个整数进行操作的。是的,anderstand,但我想知道流是否有整数元素,比如(5&:6&:7…)fromInteger可以处理it@gyok问题是:当用户编写类似于
42::Stream Int
的内容时,您希望发生什么?此时将调用
fromInteger
(Integer
42
作为参数)。类似于
fromInteger(5&:6&:7…)
将不合法,因为
fromInteger
的参数始终是一个整数。@gyok-我添加了一个可能的实现。我可以建议用
fromInteger I=keepGoing手动打结,其中
singleValue=fromInteger I
keepGoing=singleValue:&keepGoing
,避免重新评估
(来自整数i)
。(最后一行中不需要括号。)@gyok您想让
fromInteger
方法做什么?您似乎希望它获取一个流,并对其每个元素执行底层num类型的
fromInteger
操作。正如Lee所说,您不能这样做,因为
fromInteger
接受一个整数。所以你们可以通过让
fromInteger
做一些其他的事情来“修复”它,这些事情实际上是对一个整数进行操作的