実例によるPureScript 8 章 - 2
Eff モナドに関するところ。説明と演習では Eff が使われているが、Eff は deprecated になっており、Effect を使う必要がある。ST も変わっている。以下の記事が参考になった。
safeDivide2 :: Int -> Int -> Effect Int
safeDivide2 _ 0 = throwException $ error $ "Divided by 0"
safeDivide2 a b = pure (a / b)
テスト
main :: Effect Unit
main = do
x <- safeDivide2 12 2
logShow $ x
y <- catchException printException (safeDivide2 12 0)
logShow $ y
where
printException e = do
logShow e
pure 0
6
Error: Divided by 0
at Module.error (...略)
import Effect (Effect, forE)
import Effect.Random (randomRange)
import Effect.Ref (modify, new, read)
monteCarloPi :: Effect Number
monteCarloPi = do
let iter = 100000000
ref <- new 0.0
forE 0 iter \_ -> do
x <- randomRange 0.0 1.0
y <- randomRange 0.0 1.0
void $ modify (\s -> if (x * x) + (y * y) > 1.0 then s else s + 1.0) ref
p <- read ref
pure (4.0 * p / (toNumber iter))
テスト
$ spago repl
:
> import Main
> monteCarloPi
3.14137276
> monteCarloPi
3.14176996
この記事が気に入ったらサポートをしてみませんか?