如何过滤列表,保留与模式匹配的项目,删除不合适的项目?
例如,如果我有一个列表列表,我想要一个函数......
singleItemLists :: [[Int]] -> [[Int]]
...删除所有与模式[x]
不匹配的项目。
理想情况下,转换为其他模式的答案应该相当简单。
答案 0 :(得分:4)
基于显式模式匹配和filter
的惯用版本是:
{-# LANGUAGE LambdaCase #-}
isSingleton :: [x] -> Bool
isSingleton = \case [_] -> True ; _ -> False;
singletonLists :: [[x]] -> [[x]]
singletonLists = filter isSingleton
我相信这更具可读性。作为一个额外的优势,我们得到isSingleton
,可以将其重复用于其他目的。
isSingleton
在内部列表的主干和元素中是懒惰的。
答案 1 :(得分:2)
一种方法是使用列表理解
singleItemLists :: [[Int]] -> [[Int]]
singleItemLists xs = [[x] | [x] <- xs]
可以说,这一点并不清楚,因为它不是明确的,除了1之外的长度列表被删除。
答案 2 :(得分:0)
您可以使用列表monad的>>=
实现来执行此操作
singleItemLists :: [[Int]] -> [[Int]]
singleItemLists xs = xs >>= (\xs -> case xs of [x] -> [[x]]; _ -> [])
作为通过模式匹配进行过滤的示例,这有点令人困惑,因为它不清楚该模式是什么,以及需要使用列表monad的{{1 }}
可能更清晰的示例是过滤>>=
列表以保留Maybe Int
值
Just
感谢https://codereview.stackexchange.com/users/62002/centril在https://codereview.stackexchange.com/a/164380/34049
发表的评论