递归映射函数

map function, recursively

所以我有一个接受三个变量的函数。变量 y 被另一个函数调用,该函数将把它变成一个列表。

我想将映射应用到这个变量列表。这样我就可以一次使用列表中的所有元素来递归函数。

因为这个函数接受三个变量,其中一个是一个列表,我想调用这个函数并应用列表中的每个元素,直到列表为空。我不确定如何做到这一点,并且 return 每次都返回剩余的两个变量。

search :: State -> Int -> Int -> Int 
search state n1 n2 = case n1 of 
  0 -> 1 * n2
  num -> average( map (search s) n1-1 n2)
     where s = turnStateToList s

我没有将转向状态包括在内,但我认为不需要回答这个问题。基本上它会产生一个新状态列表。把它想象成一棵树。

我得到的错误是

* map is applied to too many functions 
* y has been given arguments however yy takes in 0 arguments 

我知道它是如何出现这些错误的,但是我不确定还能做些什么来修复它。我试着改变括号,结果只是给出了一个不同的参数错误。

如您问题的评论中所述,在 Haskell 中您可以递归定义变量,因此 s = turnStateToList s 并不意味着您创建一个新的 s 来获取旧 s 的 turnStateToList 的值。相反,它根据自身递归地定义 s,这导致无限表达式 s = turnStateToList (turnStateToList (turnStateToList ...,这可能不是您想要的。

为了 map 在列表上同时保持一些参数固定,你可以引入一个匿名函数,在这种情况下我认为你想要 \s'' -> search s'' (n1 - 1) n2n1 - 1 周围的括号是必要的! ).

哦,我想你不小心混淆了 states

因此,只要对您的样式进行最少的更改,我认为您需要以下代码:

search :: State -> Int -> Int -> Int 
search s n1 n2 = case n1 of 
  0 -> 1 * n2
  num -> average( map (\s'' -> search s'' (n1 - 1) n2) s')
     where s' = turnStateToList s

我认为避免 case 语句和避免将 turnStateToList s 绑定到变量更为惯用,然后您将得到以下代码:

search :: State -> Int -> Int -> Int
search _ 0  n2 = n2
search s n1 n2 = average $ map (\s' -> search s' (n1 - 1) n2) (turnStateToList s)