module Data.DP.Examples.HMM where import Data.DP import Data.Semiring data HMMState = Start | State Int states = Start : map State [0..100] hmmSimple trans (0, Start) = one hmmSimple trans (i, State curState) = mconcat $ [ f (i-1, trans ) `times` constant (lastState `trans` curState) | lastState <- states] hmmCC allTrans 0 = mkCell [mkItem Start one] hmmCC allTrans i = getCell (i-1) (\(lastState, lastScore) -> mkCell $ [ mkItem (State newState) (lastScore `times` constant score) | (newState, score) <- allTrans lastState])