-- spec.hs: conjuring a function from a specification
--
-- Adapted from Colin Runciman's example "ListFuns"
import Conjure
import Prelude hiding (sum)
sumSpec :: Spec1 [Int] Int
sumSpec =
[ [] -= 0
, [1,2] -= 3
, [3,4,5] -= 12
]
-- hoping for something like
-- sum xs = if null xs then 0 else head xs + sum (tail xs)
sumPrimitives :: [Prim]
sumPrimitives =
[ prim "null" (null :: [Int] -> Bool)
, pr (0::Int)
, prim "+" ((+) :: Int -> Int -> Int)
, prim "head" (head :: [Int] -> Int)
, prim "tail" (tail :: [Int] -> [Int])
]
appSpec :: Spec2 [Int] [Int] [Int]
appSpec =
[ (,) [] [0,1] -= [0,1]
, (,) [2,3] [] -= [2,3]
, (,) [4,5,6] [7,8,9] -= [4,5,6,7,8,9]
]
-- hoping for something like
-- app xs ys = if null xs then ys else head xs : app (tail xs) ys
appPrimitives :: [Prim]
appPrimitives =
[ prim "null" (null :: [Int] -> Bool)
, prim ":" ((:) :: Int -> [Int] -> [Int])
, prim "head" (head :: [Int] -> Int)
, prim "tail" (tail :: [Int] -> [Int])
]
main :: IO ()
main = do
conjure1 "sum" sumSpec sumPrimitives
conjure2 "++" appSpec appPrimitives