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

如何编写map语句来比较haskell中两个列表的每个元素?,haskell,compiler-errors,Haskell,Compiler Errors,我有两个函数,它们都返回一个列表: 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 我基本上是想检查enter返回的列表是否有一个2,第二个列表在该位置是否有一个0,然后将该0更改为2,否则让第二个列表中的元素保持原样 我

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

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
我基本上是想检查enter返回的列表是否有一个2,第二个列表在该位置是否有一个0,然后将该0更改为2,否则让第二个列表中的元素保持原样

我做错了什么

编辑:

有一个地球函数返回如下:[[0,0,1],[1,0,1],[0,0,0]]。enter函数取earth的头(即[0,0,1]),如下所示:[2,2,1]。helper函数取并返回earth返回的列表(即[1,0,1])的第二个元素(尾部的头)。现在see函数取这些[2,2,1]和[1,0,1]作为两个参数,如果一个元素在第一个列表中为2,在第二个列表中为0(即,在本例中,两个列表中的第二个元素,则该0在第二个列表中应变为2,并且应返回如下内容:[1,2,1]是您正在寻找的函数。
map
一次只能在一个列表上工作,因此您使用它将导致类型错误。如果您在最后一行中仅将
map
替换为
zipWith
,它应该可以工作。此外,您还应该删除
return
。在列表上下文中,
return
only pu将某些内容放入单例列表中:
return x=[x]
。请注意,
return
是一个函数,与受C语言影响的
return
没有真正的关系。我还建议此时不要对列表使用
do
符号


另外,最后一个函数没有使用其他两个函数,即使它使用了这些名称。我不确定这是否是您想要的。它相当于
的定义,请参见
,其中您使用了名称
x
y
,而不是
enter
helper

下面是一个
zipWith
的行为示例:

λ> zipWith (*) [2, 3, 4] [10, 100, 1000]
[20,300,4000]
是您正在寻找的函数。
map
一次只能在一个列表上工作,因此您使用它将导致类型错误。如果您在最后一行中仅将
map
替换为
zipWith
,它应该可以工作。此外,您还应该删除
return
。在列表的上下文中,
return
只放置s单例列表中的某个元素:
return x=[x]
。请注意,
return
是一个函数,与受C语言影响的
return
没有真正的关系。我还建议在这一点上不要对列表使用
do
符号


另外,最后一个函数没有使用其他两个函数,即使它使用了这些名称。我不确定这是否是您想要的。它相当于
的定义,请参见
,其中您使用了名称
x
y
,而不是
enter
helper

下面是一个
zipWith
的行为示例:

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

看起来你想要这样的东西:

       xs = [ ...,     1,     2,     0,     1, ... ]
       ys = [ ...,     3,     0,     4,     0, ... ]
zip xs ys = [ ..., (1,3), (2,0), (0,4), (1,0), ... ]
   result = [ ...,     3,     2,     4,     0, ... ]
result
是列表
ys
,在列表
xs
中有一个2时,0被替换为2s

因此,您可以将此逻辑非常直接地表示为列表理解:

result = [ r | (x,y) <- zip xs ys, let r = if y == 0 && x == 2 then 2 else y ]

result=[r |(x,y)看起来您想要这样的东西:

       xs = [ ...,     1,     2,     0,     1, ... ]
       ys = [ ...,     3,     0,     4,     0, ... ]
zip xs ys = [ ..., (1,3), (2,0), (0,4), (1,0), ... ]
   result = [ ...,     3,     2,     4,     0, ... ]
result
是列表
ys
,在列表
xs
中有一个2时,0被替换为2s

因此,您可以将此逻辑非常直接地表示为列表理解:

result = [ r | (x,y) <- zip xs ys, let r = if y == 0 && x == 2 then 2 else y ]

result=[r |(x,y)
map
只遍历1个列表,但您尝试同时遍历2个列表,并计算一些内容

因此,您需要一个函数,它接受一个具有2个参数的函数,2个列表,并返回一个具有相同类型函数结果的列表:

hoogle找到一个具有以下属性的函数:

因此,您编写了一个帮助器函数,它实现了您想要的功能:

helper 0 2 = 2
helper _ y = y
现在编写see函数并将helper函数放在where子句中(以后可能不需要该函数):


我不知道您为什么要使用
do
,但这在这里不是必需的。

map
只遍历一个列表,但您尝试同时遍历两个列表,并计算一些内容

因此,您需要一个函数,它接受一个具有2个参数的函数,2个列表,并返回一个具有相同类型函数结果的列表:

hoogle找到一个具有以下属性的函数:

因此,您编写了一个帮助器函数,它实现了您想要的功能:

helper 0 2 = 2
helper _ y = y
现在编写see函数并将helper函数放在where子句中(以后可能不需要该函数):


我不知道你为什么要使用
do
,但这在这里是不必要的。

使用一些
zip
函数?使用一些
zip
函数?所以,现在我在写这样的东西:参见=[r |(x,y)
enter
helper
是函数,而不是列表。如果
as
是列表,那么
enter as
也是列表,所以你想用
enter as
替换
xs
,用
helper bs
替换
ys
一些列表表达式
as
bs
,我已经解决了。你能解释一下吗我能不能在列表理解中写一些嵌套的if语句?就像返回的结果列表一样,我想对该列表的每个元素进行一些计算。在列表理解中写嵌套的if是否可能?有很多方法可以做到这一点,但是只映射f result
在哪里您想要应用于
结果的每个元素的函数
?听起来像是一个新的SO问题的很好的候选者。因此,现在我写了这样的东西:see=[r |(x,y)
enter
helper
是函数,而不是列表。如果
as
是列表,那么
enter as
也是列表