递归映射函数haskell

时间:2017-11-07 03:43:50

标签: haskell recursion mapping

我的目标是编写一个递归函数,该函数使用映射函数生成一组整数列表,这些整数列表最终从初始的整数列表生成。

为了帮助我理解我的编码需要做什么,我将lst0设置为我的初始整数列表,然后使用lst0制作lst1lst1来make lst2,依此类推。

lst0 = [1,25,100] 

lst1 =  map (\x -> 0 + x) lst0

lst2 =  map (\y -> map (\x -> y + x) lst0) lst1 

lst3 =  map (\z -> map (\y -> map (\x -> y + x) lst0) z) lst2 

lst4 =  map (\w -> map (\z -> map (\y -> map (\x -> y + x) lst0) z) w) lst3 

然后我将上面的列表重写为将前一个列表/函数作为输入的函数。它们都工作正常(例如,list4 lst3list4 $ list3 $ list2 $ list1 $ list0的缩写。

list0 = [1,25,100] 

list1 prev =  map (\x -> 0 + x) prev

list2 prev =  map (\y -> map (\x -> y + x) list0) prev

list3 prev =  map (\z -> map (\y -> map (\x -> y + x) list0)z) prev

list4 prev =  map (\w -> map (\z -> map (\y -> map (\x -> y + x) list0)z) w) prev

然后我用其中的前一个函数重写了每个函数以获得以下函数。这些也很好用。

list0' = [1,25,100] 

list1' =  map (\x -> 0 + x) list0'

list2' prev =  map (\y -> map (\x -> y + x) list0') prev

list3' prev =  map (\z -> list2' z) prev

list4' prev =  map (\w -> list3' w) prev

然而,当我尝试将上述所有函数压缩成下面的递归foo函数时,我收到有关(foo (n-1) initlst) z的以下错误。 n是我正在构建的游戏树的深度,initlst将是lst0(即[1,25,100])。

foo n initlst
 | n == 1    = map (\x -> 0 + x) initlst
 | n == 2    = map (\y -> map (\x -> y + x) initlst) $ foo 1 initlst
 | otherwise = map (\z -> (foo (n-1) initlst) z) $ foo (n-1) initlst  

错误消息如下,它引用了foo函数的这一部分:(foo (n-1) initlst) z

Couldn't match expected type ‘a1 -> a1’ with actual type ‘[a1]’
Relevant bindings include
  z :: a1 (bound at BuildTreesQ3.lhs:61:24)
  initlst :: [a1] (bound at BuildTreesQ3.lhs:58:9)
  foo :: a -> [a1] -> [a1] (bound at BuildTreesQ3.lhs:58:3)
The function ‘foo’ is applied to three arguments,
but its type ‘a -> [a1] -> [a1]’ has only two
In the expression: (foo (n - 1) initlst) z
In the first argument of ‘map’, namely
  ‘(\ z -> (foo (n - 1) initlst) z)’

对我所缺少的任何见解都将非常感激。提前谢谢。

0 个答案:

没有答案