我怎么能操纵列表理解?
How could i manipulate a list comprehension?
第一次发帖,如有不妥或不清楚的地方请见谅
我是 Haskell 的新手,我很难弄清楚如何操纵列表理解来显示我想要的内容。我有两个函数可以给我元组列表(它们基本上是矩阵,一个是完整的,另一个是随机的)
我想用列表推导创建一个新列表(矩阵),它将 return list2
元组是否与 list1
元组相同。
例如:
list1 = [(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]
list2 = [(1,0),(1,1)]
result = [False, False, False, True, True, False, False, False, False]
但是我写的列表理解给了我一个笛卡尔积
[False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False]
列表理解会继续比较 List2 中的元组,即使它已在 List1 中找到相同的元组。
这就是我写列表理解的方式:
[ (x==y) | x <- (list2), y <- (list1)]
我很确定一定有某种谓词可以写在列表理解中以获得我想要的东西,但我不知道如何实现它。
这是电子成员资格检查,因此您可以将其实现为:
[ x `elem` list2 | x <- list1 ]
但更简单的方法可能是使用 map :: (a -> b) -> [a] -> [b]
:
map (`elem` list2) list1
第一次发帖,如有不妥或不清楚的地方请见谅
我是 Haskell 的新手,我很难弄清楚如何操纵列表理解来显示我想要的内容。我有两个函数可以给我元组列表(它们基本上是矩阵,一个是完整的,另一个是随机的)
我想用列表推导创建一个新列表(矩阵),它将 return list2
元组是否与 list1
元组相同。
例如:
list1 = [(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]
list2 = [(1,0),(1,1)]
result = [False, False, False, True, True, False, False, False, False]
但是我写的列表理解给了我一个笛卡尔积
[False,False,False,True,False,False,False,False,False,False,False,False,False,True,False,False,False,False]
列表理解会继续比较 List2 中的元组,即使它已在 List1 中找到相同的元组。
这就是我写列表理解的方式:
[ (x==y) | x <- (list2), y <- (list1)]
我很确定一定有某种谓词可以写在列表理解中以获得我想要的东西,但我不知道如何实现它。
这是电子成员资格检查,因此您可以将其实现为:
[ x `elem` list2 | x <- list1 ]
但更简单的方法可能是使用 map :: (a -> b) -> [a] -> [b]
:
map (`elem` list2) list1