Skip to content

Instantly share code, notes, and snippets.

@JordanMartinez
Last active September 29, 2018 22:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JordanMartinez/a7e3fb0116301ee56bad2eab72176ff1 to your computer and use it in GitHub Desktop.
Save JordanMartinez/a7e3fb0116301ee56bad2eab72176ff1 to your computer and use it in GitHub Desktop.
My attempt at using Purescript Run to Solve "Data Types a la Carte"'s Original Problem. This doesn't work
module Free.RunBased.Value (main, value, example_value) where
import Prelude
import Effect (Effect)
import Effect.Console (log)
import Run (Run, extract)
value :: forall r. Int -> Run r Int
value i = pure i
example_value :: forall r. Run r Int
example_value = value 5
main :: Effect Unit
main = do
log $ show $ extract example_value
module Free.RunBased.Add
(
-- main
-- ,
AddF
, ADD --, add
-- , example_add
, addAlgebra
) where
import Prelude hiding (add)
import Effect (Effect)
import Effect.Console (log)
import Data.Functor.Variant (VariantF, FProxy, inj, on, case_)
import Data.Symbol (SProxy(..))
import Type.Row (type (+))
import Free.RunBased.Value (value)
import Run (Run, lift, interpret, send)
-- Data stuff
data AddF e = AddF e e
derive instance af :: Functor AddF
-- Variant Stuff
type ADD r = (add :: FProxy AddF | r)
_add :: SProxy "add"
_add = SProxy
-- 1) Compiler says the type signature for this function is:
add :: forall r
. Run (ADD + r)
-> Run (ADD + r)
-> Run (ADD + r) (Run (ADD + r) Int)
add x y = lift _add (AddF x y)
-- But this means the output type is another Run
-- which screws up my expectation for "interpret"
-- Eval stuff
addAlgebra :: forall r
. (VariantF r Int -> Int)
-> (VariantF (ADD + r) Int -> Int)
addAlgebra = on _add \(AddF x y) -> x + y
-- Examples
main :: Effect Unit
main = do
-- 2) What should "?notSure" be?
(i :: Int) <- interpret ?notSure (add (value 5) (value 6))
log $ show i
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment