在Scala和Haskell中"展平"一个List

Kev*_*ith 5 haskell scala

鉴于List[Option[Int]]:

scala> list
res8: List[Option[Int]] = List(Some(1), Some(2), None)
Run Code Online (Sandbox Code Playgroud)

我可以得到List(1,2),即提取list通道flatMapflatten:

scala> list.flatten
res9: List[Int] = List(1, 2)

scala> list.flatMap(x => x)
res10: List[Int] = List(1, 2)
Run Code Online (Sandbox Code Playgroud)

鉴于[Maybe Int]Haskell中的以下内容,我该如何执行上述操作?

我尝试了下面的失败:

import Control.Monad

maybeToList :: Maybe a -> [b]
maybeToList Just x  = [x]
maybeToList Nothing = []

flatten' :: [Maybe a] -> [a]
flatten' xs = xs >>= (\y -> y >>= maybeToList)
Run Code Online (Sandbox Code Playgroud)

Lee*_*Lee 14

你可以使用catMaybes:

import Data.Maybe
catMaybes xs
Run Code Online (Sandbox Code Playgroud)

如果你想使用>>=你需要一个功能Maybe a -> [a].这是maybeToList:

xs >>= maybeToList
Run Code Online (Sandbox Code Playgroud)

正如评论指出的那样,您可以将任何Foldable一个转换为列表,这样您就可以flatten'更通用:

flatten' :: Foldable f => [f a] -> [a]
flatten' xs = xs >>= toList
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要一个比"Maybe"更通用的答案,你可以使用`Data.Foldable.toList`而不是`maybeToList`. (8认同)

Dom*_*ese 9

你可能刚刚问了Hoogle.它是Haskell函数的搜索引擎:您输入一个类型,它提出了可以在这种类型中使用的函数.对于该类型[Maybe a] -> [a],其第一个结果catMaybes来自Data.Maybe.