递归映射函数
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) n2
( n1 - 1
周围的括号是必要的! ).
哦,我想你不小心混淆了 state
和 s
。
因此,只要对您的样式进行最少的更改,我认为您需要以下代码:
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)
所以我有一个接受三个变量的函数。变量 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) n2
( n1 - 1
周围的括号是必要的! ).
哦,我想你不小心混淆了 state
和 s
。
因此,只要对您的样式进行最少的更改,我认为您需要以下代码:
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)