scala - 在 Haskell 中实现 List#flatten

标签 scala haskell

Scala 提供了一个 List#flattenList[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功能?

最佳答案

您的 flattencatMaybes 相同(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/

相关文章:

string - 文本或字节串

haskell - 为什么 (Haskell) Repa 只使用一个 CPU?

scala - Scala 3/Dotty 中的依赖元组

function - scala匿名函数问题

scala - 在 main 和 test 中重复包对象

java - 在 Scala 中,如何子类化具有多个构造函数的 Java 类?

Scala:将返回类型转换为自定义特征

haskell - 为什么通用量化变量不在此 Haskell 函数的范围内?

haskell - 读取 haskell 中的数字列表

generics - 如何在 Scrap Your Boilerplate (SYB) 中使用 `local` 和 `Reader` monad?