Skip to content

Commit 57a5897

Browse files
authored
add EsSi solution (#30)
1 parent 177eb11 commit 57a5897

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

MonadsAndEffects/3.3/essi.hs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
module Essi where
2+
3+
import Control.Monad (when)
4+
import Control.Monad.Trans (lift)
5+
import Control.Monad.Trans.State
6+
import Control.Monad.Trans.Except
7+
8+
9+
tickCollatz :: State Integer Integer
10+
tickCollatz = do
11+
n <- get
12+
let res = if odd n then 3 * n + 1 else n `div` 2
13+
put res
14+
return n
15+
16+
17+
type EsSi = ExceptT String (State Integer)
18+
19+
20+
runEsSi :: EsSi a -> Integer -> (Either String a, Integer)
21+
runEsSi = runState . runExceptT
22+
23+
24+
go :: Integer -> Integer -> State Integer Integer -> EsSi ()
25+
go lower upper s = do
26+
n <- lift get
27+
let next = execState s n
28+
lift $ put next
29+
when (next >= upper) (throwE "Upper bound")
30+
when (next <= lower) (throwE "Lower bound")
31+
32+
33+
go2 :: Integer -> Integer -> State Integer Integer -> EsSi ()
34+
go2 lower upper s = do
35+
lift s
36+
n <- lift get
37+
when (n >= upper) (throwE "Upper bound")
38+
when (n <= lower) (throwE "Lower bound")

0 commit comments

Comments
 (0)