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)
我试图在 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
但是我不喜欢
g
是一个部分的,即非全部的函数。有没有总计 写这样的方式
flatten
功能?
最佳答案
您的 flatten
与 catMaybes
相同(link)定义如下:
catMaybes :: [Maybe a] -> [a]
catMaybes ls = [x | Just x <- ls]
特殊语法
Just x <- ls
在列表理解中意味着从 ls
中绘制一个元素如果不是 Just
,则丢弃它.否则分配 x
通过模式匹配值对 Just x
.
关于scala - 在 Haskell 中实现 List#flatten,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27773779/