に終了し、私は種類を作成しScalaz:それは私はモナド変圧器を勉強なし
それらを配列決定し、問題を持っていないので、タイプOptionT [州立[_]、T]のモナドを組み合わせる方法OptionTBitSetState[T]
I署名付き機能ステップを有する
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
を追加し、Seq(i, i*10, i*100)
- チェックそれが含まれていない場合は国家内部のBitSetは、パラメータ
i
-
- が含まれている場合:失敗すると
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)
戻りNone
が、何が欲しいです:
List(Some(Seq(1, 10, 100)), Some(Seq(2, 20, 200)), None, Some(Seq(3, 30, 300)))
は私がOptionTBitSetState[T]
を組み合わせることができます任意の方法はありますので、私は、私は必要な動作を得るのだろうか?
ありがとうございました! –