通过模式匹配过滤列表

时间:2017-06-07 21:05:32

标签: haskell

如何过滤列表,保留与模式匹配的项目,删除不合适的项目?

例如,如果我有一个列表列表,我想要一个函数......

singleItemLists :: [[Int]] -> [[Int]]

...删除所有与模式[x]不匹配的项目。

理想情况下,转换为其他模式的答案应该相当简单。

3 个答案:

答案 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/centrilhttps://codereview.stackexchange.com/a/164380/34049

发表的评论
相关问题