选项列表:相当于Scala中的序列?

lun*_*ain 14 haskell scala sequence

什么是sequenceScala中的Haskell ?我想将选项列表转换为列表选项.它应该像None任何选项一样出现None.

List(Some(1), None, Some(2)).???     --> None
List(Some(1), Some(2), Some(3)).???  --> Some(List(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)

mpi*_*ist 24

Scalaz定义了序列.

这是一个例子:

scala> import scalaz._
import scalaz._

scala> import Scalaz._
import Scalaz._

scala> List(Some(1), None, Some(2)).sequence
res0: Option[List[Int]] = None

scala> List(some(1), some(2), some(3)).sequence
res1: Option[List[Int]] = Some(List(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)

请注意,在第二个示例中,您必须使用Scalaz的某个函数来创建Some - 否则,List将构造为List [Some [Int]],这会导致此错误:

scala> List(Some(1), Some(2), Some(3)).sequence
<console>:14: error: could not find implicit value for parameter n: scalaz.Applicative[N]
       List(Some(1), Some(2), Some(3)).sequence
Run Code Online (Sandbox Code Playgroud)

Scalaz some(a)和none函数创建Option [A]类型的Some和None值.


Mil*_*bin 16

如果你想要一个只有List和Option的解决方案,而不是一般的monad那么下面就可以完成这个工作,

def sequence[T](l : List[Option[T]]) = 
  if (l.contains(None)) None else Some(l.flatten)
Run Code Online (Sandbox Code Playgroud)

REPL会议,

scala> sequence(List(Some(1), None, Some(2)))
res2: Option[List[Int]] = None

scala> sequence(List(Some(1), Some(2), Some(3)))
res3: Option[List[Int]] = Some(List(1, 2, 3)) 
Run Code Online (Sandbox Code Playgroud)

2014年8月8日更新

只需使用Scalaz ......