extensible-effectsのEffでMaybeを使う(Failを使う)
extensible-effectsにはFail
という型(作用)があるので、そちらを使うのが一番楽かと思います 🐕
newtype Exc e v = Exc e
type Fail = Exc ()
{-# LANGUAGE FlexibleContexts #-}
import Control.Eff (Member, Eff, run)
import Control.Eff.Exception(Fail, runFail, liftMaybe)
safeHeadEff :: Member Fail r => [a] -> Eff r a
safeHeadEff [] = liftMaybe Nothing
safeHeadEff (x:_) = return x
main :: IO ()
main = do
let x = run . runFail $ safeHeadEff [1..10]
print x
ちなみにliftMaybeM
という関数をextensible-effectsにPRしました(マージされた)