您可以与group :: Eq a => [a] -> [[a]] https://hackage.haskell.org/package/base-4.14.1.0/docs/Data-List.html#v:group制作组列表。因此,对于给定的样本数据,这将生成:
Prelude> import Data.List(group)
Prelude Data.List> group [2,3,4,1,7,7,7,3,4,1,1,1,3]
[[2],[3],[4],[1],[7,7,7],[3],[4],[1,1,1],[3]]
然后我们可以为每个子列表只产生第一个元素head
,我们知道这样的元素存在,因为否则它永远不会首先构造一个新的组:
Prelude Data.List> map head (group [2,3,4,1,7,7,7,3,4,1,1,1,3])
[2,3,4,1,7,3,4,1,3]
这意味着您可以定义f
as:
import Data.List(group)
f :: Eq a => [a] -> [a]
f = map head . group
这也适用于无限列表。例如,如果我们以无限列表结束列表5
s,然后它处理列表直到五个并继续寻找新值:
Prelude Data.List> map head (group (2 : 3 : 4 : 1 : 7 : 7 : 7 : 3 : 4 : 1 : 1 : 1 : 3 : repeat 5))
[2,3,4,1,7,3,4,1,3,5
或者我们可以利用group :: (Foldable f, Eq a) => f a -> [NonEmpty a] https://hackage.haskell.org/package/base-4.14.1.0/docs/Data-List-NonEmpty.html#v:group of Data.List.NonEmpty
:
import Data.List.NonEmpty(group)
import qualified Data.List.NonEmpty as NE
f :: Eq a => [a] -> [a]
f = map NE.head . group