-
Notifications
You must be signed in to change notification settings - Fork 22
Open
Description
Hi, during investigating topic of Free monads, I have found your blog post about performance of extensible. I have found it interesting and tried to start using, but struggling to do it.
Other libraries has more examples to compare.
For example, I can't get into how to implement with extensible the example for freer:
{-# LANGUAGE GADTs #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
module Console where
import Control.Monad.Freer
import Control.Monad.Freer.Internal
import System.Exit hiding (ExitSuccess)
--------------------------------------------------------------------------------
-- Effect Model --
--------------------------------------------------------------------------------
data Console s where
PutStrLn :: String -> Console ()
GetLine :: Console String
ExitSuccess :: Console ()
putStrLn' :: Member Console r => String -> Eff r ()
putStrLn' = send . PutStrLn
getLine' :: Member Console r => Eff r String
getLine' = send GetLine
exitSuccess' :: Member Console r => Eff r ()
exitSuccess' = send ExitSuccess
--------------------------------------------------------------------------------
-- Effectful Interpreter --
--------------------------------------------------------------------------------
runConsole :: Eff '[Console] w -> IO w
runConsole (Val x) = return x
runConsole (E u q) =
case extract u of
PutStrLn msg -> putStrLn msg >> runConsole (qApp q ())
GetLine -> getLine >>= \s -> runConsole (qApp q s)
ExitSuccess -> exitSuccess
--------------------------------------------------------------------------------
-- Pure Interpreter --
--------------------------------------------------------------------------------
runConsolePure :: [String] -> Eff '[Console] w -> [String]
runConsolePure inputs req =
reverse . snd $ run (handleRelayS (inputs, []) (\s _ -> pure s) go req)
where
go :: ([String], [String])
-> Console v
-> (([String], [String]) -> Arr '[] v ([String], [String]))
-> Eff '[] ([String], [String])
go (is, os) (PutStrLn msg) q = q (is, msg : os) ()
go (i:is, os) GetLine q = q (is, os) i
go ([], _ ) GetLine _ = error "Not enough lines"
go (_, os) ExitSuccess _ = pure ([], os)
I am aware of extensible's example/effects.hs, but it does not compiling:
/mnt/localdata/share/devel/haskell/ext-test/app/Main.hs:43:27: error:
• Expected kind ‘[Assoc * (* -> *)]’,
but ‘Example’ has kind ‘[Assoc
ghc-prim-0.5.1.1:GHC.Types.Symbol (* -> *)]’
• In the first argument of ‘Methods’, namely ‘Example’
In the type signature: example :: Int -> Methods Example IO
|
43 | example :: Int -> Methods Example IO
| ^^^^^^^
Metadata
Metadata
Assignees
Labels
No labels