Skip to content

Instantly share code, notes, and snippets.

@paf31
Last active December 29, 2015 14:49
Show Gist options
  • Save paf31/7686268 to your computer and use it in GitHub Desktop.
Save paf31/7686268 to your computer and use it in GitHub Desktop.
data Zero = Zero
data Succ a = Succ a
pred = \s -> case s of Succ a -> a
meters = \n v -> v { value = n * v.value, meters = Succ (v.meters) }
seconds = \n v -> v { value = n * v.value, seconds = Succ (v.seconds) }
perSecond = \n v -> v { value = n * v.value, seconds = pred (v.seconds) }
(*.) :: forall r s t. ({ value :: Number | r } -> { value :: Number | s }) -> ({ value :: Number | s } -> { value :: Number | t }) -> { value :: Number | r } -> { value :: Number | t }
(*.) = \n m x -> m (n x)
(+.) :: forall i o. (i -> { value :: Number | o }) -> (i -> { value :: Number | o }) -> i -> { value :: Number | o }
(+.) = \f g x -> do
var v1 = f x
var v2 = g x
return v2 { value = v1.value + v2.value }
test = seconds 1 *. seconds 1
-- fail = seconds 1 +. perSecond 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment