2016-12-29 42 views
1

終止我學習的單子變壓器和有問題測序他們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]] 

這個功能應該:

  1. 檢查內部國家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,所以我會得到我需要的行爲?

回答

2

在我看來,你是通過使用OptionT過度複雜的解決方案。

OptionT的問題在於它想要將monad中的值視爲存在或不存在,因此當您將單個計算「摺疊」爲單個狀態來運行它時,任何單個故障都必須導致整個事件失敗。我可以使用State[BitSet,Option[Seq[Int]]。這裏有一個(爲簡單起見稍作修改)Haskell版本,因爲我沒有特別好的說斯卡拉。

module Main where 

import Control.Monad.State 
import Data.IntSet (IntSet) 
import qualified Data.IntSet as IntSet 
import Data.Maybe (isJust) 

step :: Int -> State IntSet (Maybe [Int]) 
step i = do 
    set <- get 
    if not (IntSet.member i set) 
    then do 
     modify $ IntSet.insert i 
     return $ Just [i, i*10, i*100] 
    else return Nothing 

run xs = filter isJust $ flip evalState IntSet.empty $ mapM step xs 

main = do 
    let result = run [1,2,1,3] 
    print result 

你真正想要的是mapM或什麼Scala的等價物。然後運行狀態操作並刪除Nothing值。

+0

謝謝你的好解釋! –

相關問題