終止我學習的單子變壓器和有問題測序他們Scalaz:如何結合型OptionT [國發[_],T]的單子,所以它不會在無
我創建了一個類型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]]
這個功能應該:
- 檢查內部國家BitSet中包含的參數
i
-
- 如果它不包含:加
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
我想序列一步 S IN這樣的方式,當我評價這個序列中,我得到的選擇結果列表的列表。但sequence
的簽名不同。我可以選擇列表。
例如
List(1,2,1,3).map(step).sequence.run(BitSet.empty)
回報None
,但我要的是:
List(Some(Seq(1, 10, 100)), Some(Seq(2, 20, 200)), None, Some(Seq(3, 30, 300)))
有沒有什麼辦法可以結合OptionTBitSetState[T]
S,所以我會得到我需要的行爲?
謝謝你的好解釋! –