在Haskell中实现List#flatten

Kev*_*ith 4 haskell scala

Scala提供了List#flatten一种从哪里List[Option[A]]开始List[A].

scala> val list = List(Some(10), None)
list: List[Option[Int]] = List(Some(10), None)

scala> list.flatten
res11: List[Int] = List(10)
Run Code Online (Sandbox Code Playgroud)

我试图在Haskell中实现它:

flatten :: [Maybe a] -> [a]
flatten xs = map g $ xs >>= f

f :: Maybe a -> [Maybe a]
f x = case x of Just _  -> [x]
                Nothing -> []

-- partial function!
g :: Maybe a -> a
g (Just x) = x
Run Code Online (Sandbox Code Playgroud)

但是,我不喜欢这g是一个部分的,即非全部的功能.

是否有完整的方法来编写这样的flatten功能?

Eri*_*ikR 10

flattencatMaybes (链接)是这样定义的:

catMaybes :: [Maybe a] -> [a]
catMaybes ls = [x | Just x <- ls]
Run Code Online (Sandbox Code Playgroud)

Just x <- ls列表推导中的特殊语法意味着从中绘制元素ls并将其丢弃(如果它不是a)Just.否则x通过匹配值的模式进行分配Just x.