我的目标是编写一个递归函数,该函数使用映射函数生成一组整数列表,这些整数列表最终从初始的整数列表生成。
为了帮助我理解我的编码需要做什么,我将lst0
设置为我的初始整数列表,然后使用lst0
制作lst1
和lst1
来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 lst3
是list4 $ 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)’
对我所缺少的任何见解都将非常感激。提前谢谢。