haskell - 如何编写map语句来比较haskell中两个列表的每个元素?

我有两个函数都返回一个列表:

enter earth = head $ do
  lst <- earth
  return $ map (\x -> if (x == 0) then 2 else x) lst

helper earth = head $ do
  lst <- tail (earth)
  return lst

其中 earth 是另一个返回列表列表的函数,例如 [[1,2,3],[2,3,4],[4,7,3]]。在辅助函数中,我返回此列表列表的第二个元素,即尾部的头部。而在输入函数中,只有头部。现在我正在编写另一个函数,我想将这两个函数作为参数传递给它。我正在这样做:
see :: [Int] -> [Int] -> [Int]
see enter helper = return $ map (\ x y -> if (x == 2) && (y == 0) then 2 else y) enter helper

我基本上想要做的是检查 enter 返回的列表是否有 2 并且第二个列表在该位置有一个零,然后将 0 更改为 2 否则让第二个列表中的元素保持原样。

我在这里做错了什么?

编辑:

因此,有一个地球函数返回如下:[[0,0,1],[1,0,1],[0,0,0]]。 enter 函数获取地球的头部(即 [0,0,1] 并使其如下所示:[2,2,1]。辅助函数获取并返回第二个元素(尾部的头部) earth 返回的列表列表(即 [1,0,1])。现在 see 函数将这些 [2,2,1] 和 [1,0,1] 作为两个参数,如果一个元素是2 在第一个列表中, 0 在第二个列表中(即,从这个示例中,两个列表中的第二个元素,那么 0 应该在第二个列表中变为 2,并且应该返回的内容应该是这样的:[1, 2,1]

最佳答案

zipWith 是您正在寻找的功能。 map一次只能在一个列表上工作,所以你使用它会导致类型错误。如果你只是替换 mapzipWith在最后一行,它应该工作。此外,您应该删除 return .在列表的上下文中,return仅将某些内容放入单例列表中:return x = [x] .请注意 return是一个函数,与 return 没有真正的关系。在受 C 语言影响的语言中。我还建议不要使用 do此时列表的符号。

此外,最后一个函数没有使用其他两个函数,即使它使用了这些名称。我不确定这是否是你想要的。相当于see的定义您在哪里使用了名称 xy而不是 enterhelper .

这是 zipWith 的行为示例:

λ> zipWith (*) [2, 3, 4] [10, 100, 1000]
[20,300,4000]

https://stackoverflow.com/questions/26704540/

相关文章:

android - Android : Take numbers, do calculations,

oracle - 错误(3,31): PL/SQL: ORA-00984: Column is no

compiler-errors - 编程新手,无法让Visual Studio 2013打开包含文件

c# - 错误: [feature] requires a Business (or higher)

c# - 具有只读哈希表的嵌套内部类在分配时引发Null ref异常。

haskell - 尝试遍历森林 Haskell 编译错误

c++ - Visual Studio中D8049错误的原因是什么?

c# - 分配的左侧必须是变量属性或索引器

python - 无法运行Python脚本

c# - C#简单兴趣计算器切换错误