鉴于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通道flatMap和flatten:
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)