如何编写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
也是列表