我有一个包含函数的自定义数据类型Flist
。在下一步中,我想使用Flist myFunctions
中的apply
。
注意:这是一个练习,所以我必须使用自定义列表
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
我收到错误:
- 没有实例(Num(整数 - >整数)) 文字“2”引起的 (也许你还没有将一个函数应用到足够的参数?)
- 在'apply'的第二个参数中,即'2' 在表达式中:apply myFunctions 2 在'it'的等式中:it = apply myFunctions 2
问题:我没有看到我的错误。为什么我应该没有为函数应用足够的参数?我传递一个Flist,其函数获取Int并返回Int。另外另一个Int被传递,应该是它。还缺少什么?
答案 0 :(得分:3)
您的代码存在一些问题。
你有
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
会发现另一个问题:(f b)
和f :: a -> a
b :: b
。但是a
和b
是不同的类型变量,并且(至少可能)是不同的。要允许此功能应用程序,它必须是apply :: Flist a -> a -> a
。