我正在学习monad变形金刚,在排序它们时遇到了问题
我创建了一个类型
OptionTBitSetState[T]
我对这种类型的理解是
可能失败的有状态计算
import scalaz._, Scalaz._
import scala.collection.immutable.BitSet
type BitSetState[T] = State[BitSet, T]
type OptionTBitSetState[T] = OptionT[BitSetState, T]
object OptionTBitSetState {
def apply[T](option : Option[T]) : OptionT[BitSetState, T] =
OptionT[BitSetState, T](State[BitSet, Option[T]](_ -> option))
def apply[T](state : State[BitSet, T]) : OptionT[BitSetState, T] =
OptionT[BitSetState, T](state.map(_.some))
}
我有一个功能
步
签名
def step(i : Int) : OptionTBitSetState[Seq[Int]]
该功能应:
-
检查状态内的位集是否包含参数
i
-
-
如果不包含:添加
我
设置位并返回
Seq(i, i*10, i*100)
-
如果包含:失败
None
功能的实现
步
:
def step(i : Int) : OptionTBitSetState[Seq[Int]] =
for {
usedIs <- OptionTBitSetState(get[BitSet])
res <- OptionTBitSetState(
Some(Seq(i, i*10, i*100)).filterNot(_ => usedIs.contains(i))
)
_ <- OptionTBitSetState(put(usedIs + i))
} yield res
我想排序一个列表
步
这样,当我计算这个序列时,我得到了一个选项列表。但签名
sequence
是不同的。我得到了一个列表选项。
例如
List(1,2,1,3).map(step).sequence.run(BitSet.empty)
返回
没有一个
,但我想要的是:
List(Some(Seq(1, 10, 100)), Some(Seq(2, 20, 200)), None, Some(Seq(3, 30, 300)))
有什么方法可以结合起来吗
OptionBitSetState[T]
s、 所以我会得到我需要的行为?