-- count.hs: elem and set functions import Conjure count :: Eq a => a -> [a] -> Int count x = c where c [] = 0 c (y:ys) = (if x == y then 1 else 0) + c ys -- this is the expected function countIf :: A -> [A] -> Int countIf x xs = if null xs -- 3 then 0 -- 4 else (if x == head xs then 1 else 0) + countIf x (tail xs) -- 16 -- 5 6 7 8 9 10 11 12 13 14 15 16 count' :: A -> [A] -> Int count' 0 [0] = 1 count' 0 [1] = 0 count' 1 [0] = 0 count' 1 [1] = 1 count' 0 [0,0] = 2 count' 0 [0,1] = 1 count' 0 [1,2] = 0 count' 1 [0,0] = 0 count' 1 [0,1] = 1 count' 1 [1,2] = 1 count' 0 [0,0,0] = 3 count' 0 [0,0,1] = 2 count' 0 [1,0,0] = 2 main :: IO () main = do -- count x xs = length (filter (== x) xs) -- 1 2 3 4 5 conjure "count" count' [ prim "length" (length :: [A] -> Int) , prim "filter" (filter :: (A -> Bool) -> [A] -> [A]) , prim "==" ((==) :: A -> A -> Bool) ] conjureWithMaxSize 16 "count" count' [ pr (0 :: Int) , pr (1 :: Int) , prim "+" ((+) :: Int -> Int -> Int) , prim "head" (head :: [A] -> A) , prim "tail" (tail :: [A] -> [A]) , prim "null" (null :: [A] -> Bool) , prim "==" ((==) :: A -> A -> Bool) , prim "if" (\p x y -> if p then x else y :: Int) ]