Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.65 KB | None | 0 0
  1. #!/usr/bin/env stack
  2. -- stack --resolver lts-14.7 script
  3.  
  4. -- How I run it:
  5. -- fswatch -o src | xargs -n1 -I{} sh -c 'clear && ./src/church.hs'
  6.  
  7. {-# LANGUAGE RankNTypes #-}
  8. {-# LANGUAGE OverloadedStrings #-}
  9. {-# LANGUAGE NoImplicitPrelude #-}
  10.  
  11. module ChurchEnc where
  12.  
  13. import Protolude (IO, Text, putText, show)
  14. import qualified Data.Bool as Hask
  15. import Data.Semigroup ((<>))
  16. import qualified GHC.Natural as Hask
  17. import qualified Prelude
  18.  
  19. --------------------------------------------------------------------
  20. --------------------------- Booleans -------------------------------
  21. --------------------------------------------------------------------
  22.  
  23. type Boolean = forall a . a -> a -> a
  24.  
  25. true :: Boolean
  26. true x _ = x
  27.  
  28. false :: Boolean
  29. false _ y = y
  30.  
  31. toBoolean :: Boolean -> Hask.Bool
  32. toBoolean b = b Hask.True Hask.False
  33.  
  34. fromBoolean :: Hask.Bool -> Boolean
  35. fromBoolean Hask.True = true
  36. fromBoolean Hask.False = false
  37.  
  38. not :: Boolean -> Boolean
  39. not b t f = b f t
  40.  
  41. or :: Boolean -> Boolean -> Boolean
  42. or a b t f = a t (b t f) -- a a b
  43.  
  44. and :: Boolean -> Boolean -> Boolean
  45. and a b t f = a (b t f) f -- a b a
  46.  
  47. -- xor :: Boolean -> Boolean -> Boolean
  48. -- xor = notImplemented
  49.  
  50. testBooleans :: IO ()
  51. testBooleans = do
  52. putText "\n--- Boolean <-> Bool isomorphism ---"
  53. putText ("toBoolean true = " <> toStr true)
  54. putText ("toBoolean false = " <> toStr false)
  55. putText ("fromBoolean True = " <> toStr (fromBoolean Hask.True))
  56. putText ("fromBoolean False = " <> toStr (fromBoolean Hask.False))
  57.  
  58. putText "\n--- not ---"
  59. putText ("not true = " <> toStr (not true))
  60. putText ("not false = " <> toStr (not false))
  61.  
  62. putText "\n--- or ---"
  63. putText ("false `or` false = " <> toStr (false `or` false))
  64. putText ("false `or` true = " <> toStr (false `or` true))
  65. putText ("true `or` false = " <> toStr (true `or` false))
  66. putText ("true `or` true = " <> toStr (true `or` true))
  67.  
  68. putText "\n--- and ---"
  69. putText ("false `and` false = " <> toStr (false `and` false))
  70. putText ("false `and` true = " <> toStr (false `and` true))
  71. putText ("true `and` false = " <> toStr (true `and` false))
  72. putText ("true `and` true = " <> toStr (true `and` true))
  73.  
  74. putText "\n--- xor ---"
  75. -- putText ("false `xor` false = " <> toStr (false `xor` false ))
  76. -- putText ("false `xor` true = " <> toStr (false `xor` true ))
  77. -- putText ("true `xor` false = " <> toStr (true `xor` false ))
  78. -- putText ("true `xor` true = " <> toStr (true `xor` true ))
  79. where
  80. toStr :: Boolean -> Text
  81. toStr churchBool =
  82. let haskellBool = toBoolean churchBool in show haskellBool
  83.  
  84. --------------------------------------------------------------------
  85. ----------------------- Natural numbers ----------------------------
  86. --------------------------------------------------------------------
  87.  
  88. type Natural = forall a . (a -> a) -> a -> a
  89.  
  90. toHaskNatural :: Natural -> Hask.Natural
  91. toHaskNatural n = n Prelude.succ 0
  92.  
  93. fromHaskNatural :: Hask.Natural -> Natural
  94. fromHaskNatural 0 = \_ x -> x
  95. fromHaskNatural n = \f x ->
  96. let m :: Natural
  97. m = fromHaskNatural (Prelude.pred n)
  98. in f (m f x)
  99.  
  100. zero :: Natural
  101. zero _ x = x -- zero f = id
  102.  
  103. one :: Natural
  104. one f x = f x
  105. -- one f = f
  106. -- one f x = f (zero f x)
  107. -- one = id
  108.  
  109. testNaturalNumbers :: IO ()
  110. testNaturalNumbers = do
  111. putText ("toHaskNatural zero = " <> show (toHaskNatural zero))
  112. putText ("toHaskNatural one = " <> show (toHaskNatural one))
  113.  
  114.  
  115. --------------------------------------------------------------------
  116. ---------------------------- Main ----------------------------------
  117. --------------------------------------------------------------------
  118.  
  119. main :: IO ()
  120. main = do
  121. putText "---- Encoding Demo ---- "
  122. testBooleans
  123.  
  124. putText "\n--- Naturals ---"
  125. testNaturalNumbers
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement