Haskell - 自定义数据类型

时间:2017-03-18 16:25:21

标签: haskell recursion functional-programming

我有一个包含函数的自定义数据类型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被传递,应该是它。还缺少什么?

1 个答案:

答案 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。但是ab是不同的类型变量,并且(至少可能)是不同的。要允许此功能应用程序,它必须是apply :: Flist a -> a -> a