api*_*gov 4 haskell reactive-banana
在反应香蕉<1.0.0,这工作:
-- takes a start value, minimum and maximum value, flag whether counter is
-- cyclic, an increment and decrement event stream and returns a behavior
mkCounter :: (Enum a,Ord a) => a -> Maybe a -> Maybe a -> Bool
-> Event t b -> Event t c -> Behavior t a
mkCounter start minVal maxVal cyclic incE decE = counter
let incF curr | isNothing maxVal = succ
| Just maxv <- maxVal, curr<maxv = succ
| Just maxv <- maxVal, Just minv <- minVal, cyclic = const minv
| otherwise = id
decF curr | isNothing minVal = pred
| Just minv <- minVal, curr>minv = pred
| Just minv <- minVal, Just maxv <- maxVal, cyclic = const maxv
| otherwise = id
counter = accumB start $ ((incF <$> counter) <@ incE) `union`((decF <$> counter) <@ decE)
Run Code Online (Sandbox Code Playgroud)
现在,counter就其本身而言.但是在新的monadic API中,accumB是一个monadic函数,这是我看不到如何继续的地方 - Moment没有MonadFix实例,所以它现在如何工作?
由于显而易见的原因,这不起作用('不在范围内:计数器')
mkCounter :: (MonadMoment m,Enum a,Ord a) => a -> Maybe a -> Maybe a -> Bool
-> Event b -> Event c -> m (Behavior a)
mkCounter start minVal maxVal cyclic incE decE = do
-- .. same as above ..
counter <- accumB start $ unions [((incF <$> counter) <@ incE)
,((decF <$> counter) <@ decE)]
return counter
Run Code Online (Sandbox Code Playgroud)
现在这样做的正确方法是什么?提前致谢!
好的,这是一个愚蠢的错误.我只需要添加MonadFix m作为约束,因为我不Moment直接使用Monad:
mkCounter :: (MonadFix m,MonadMoment m,Enum a,Ord a) => a -> Maybe a -> Maybe a -> Bool
-> Event b -> Event c -> m (Behavior a)
Run Code Online (Sandbox Code Playgroud)
然后它按预期工作mdo.
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |