【问题标题】:map function, recursively递归映射函数
【发布时间】:2021-08-13 16:32:31
【问题描述】:

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

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

因为这个函数接受三个变量,一个是一个列表,我想调用函数并应用列表的每个元素,直到列表为空。我不确定如何执行此操作并每次都返回剩余的两个变量。

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 

我知道它是如何得到这些错误的,但是我不确定还有什么办法可以修复它。我试过改变括号,这只会给出不同的参数错误。

【问题讨论】:

  • where y = anotherfunc y mjakes 没有意义,因为您根据y 定义y,所以是递归定义。
  • 坦率地说,没有这很有意义。请举例说明您实际上希望如何在实践中使用func。 (顺便说一句,不要调用函数func!)
  • “我想将映射应用于变量 y,这样每次我调用函数时,都会从 y 列表中给出不同的 y 值。”我正在努力理解它的实际含义。你能展示几个函数输入和期望输出的例子吗?
  • 我已经更新了这个问题。感谢您的帮助和反馈。
  • 能否请您提供一些输入和预期输出?我们很难弄清楚你真正想要做什么,这可能会有很大帮助。因为我真的试过了,但不知道你想在这里实现什么。

标签: haskell recursion map-function


【解决方案1】:

正如您的问题的 cmets 中所提到的,在 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)

【讨论】:

    猜你喜欢
    • 2020-04-06
    • 2011-07-24
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    相关资源
    最近更新 更多