繁体   English   中英

Haskell-具有自定义数据类型的函数的(Num(Integer-> Integer))没有实例

[英]Haskell - No instance for (Num (Integer -> Integer)) for function with custom data type

我有一个包含函数的自定义数据类型Flist 在下一步中,我想在apply使用Flist myFunctions

注意 :这是一个练习,所以我必须使用自定义列表

data Flist a = Nil | Cons (a -> a) (Flist a)

myFunctions :: Flist (Integer -> Integer)
myFunctions = (Cons (\y x -> x + 1) ( Cons (\x w -> w + 1) (Nil)))

apply :: Flist (a -> a) -> b -> b
apply Nil b         = b
apply (f `Cons` xs) b = apply xs (f b)

调用应如下所示: apply myFunctions 1返回3

我得到错误:

  • 字面量'2'不会引起(Num(Integer-> Integer))的实例(也许您没有对足够的参数应用函数?)
    • 在'apply'的第二个参数中,即'2'在表达式中:apply myFunctions 2在'it'的等式中:it = apply myFunctions 2

问题 :我看不到我的错误。 为什么我应该对函数应用的参数不足? 我将Flist传递给具有Int并返回Int的函数。 另外,还传递了另一个Int,应该是它。 这里还缺少什么?

您的代码有几个问题。

你有

data Flist a = Nil | Cons (a -> a) (Flist a)
--         ^               ^^^^^^

因此,如果您具有函数f :: Integer -> Integer ,则Cons f Nil类型为Flist Integer ,而不是Flist (Integer -> Integer)

实际上, Flist (Integer -> Integer)将是(Integer -> Integer) -> (Integer -> Integer)类型的函数列表。

这意味着myFunctions :: Flist (Integer -> Integer)的类型错误。 如果解决此问题,您会发现它的代码也不正确。


然后apply :: Flist (a -> a) -> b -> b 这是上述问题的另一个实例(一层“功能性”过多)。 将其更改为apply :: Flist a -> b -> b显示另一个问题:您执行(fb)其中f :: a -> a (fb) f :: a -> ab :: b 但是ab是不同的类型变量,并且(至少可能)是不同的。 要允许该功能应用,必须将其apply :: Flist a -> a -> a

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM