Skip to content

Instantly share code, notes, and snippets.

@SophiaSaiada
Created January 7, 2020 14:05
Show Gist options
  • Save SophiaSaiada/4bcdc401767be16c95d3f17c8daef0e1 to your computer and use it in GitHub Desktop.
Save SophiaSaiada/4bcdc401767be16c95d3f17c8daef0e1 to your computer and use it in GitHub Desktop.
{-# LANGUAGE RankNTypes #-}
import Prelude hiding (succ)
newtype CNumber = Nr (forall t. (t -> t) -> t -> t)
zero :: CNumber
zero = Nr (\ f x -> x )
one = Nr (\ f x -> f x )
two = Nr (\ f x -> f (f x) )
eval :: CNumber -> Int
eval (Nr n) = n (+1) 0
succ :: CNumber -> CNumber
succ (Nr a) = Nr (\ f x -> f (a f x) )
add :: CNumber -> CNumber -> CNumber
-- add (Nr a) (Nr b) = Nr (\ f x -> a f (b f x))
add (Nr a) (Nr b) = a succ (Nr b)
-- add (Nr a) = a succ
mult :: CNumber -> CNumber -> CNumber
mult (Nr a) (Nr b) = a (add (Nr b)) zero
-- mult (Nr a) b = a (add b) zero
pow :: CNumber -> CNumber -> CNumber
pow (Nr a) (Nr b) = b (mult (Nr a)) one
-- pow a (Nr b) = b (mult a) one
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment