I am constructing a basic function in Haskell that return the list of variables that appear in a Boolean expression.
For some reason I am stuck in a test case.
I am a still beginner so can someone explain what's happening here?
Here is the code:
module BoolExpr (Variable, BoolExpr(..), evaluate) where
import Data.List
import System.IO
type Variable = Char
data BoolExpr = T
|F
|Var Variable
|Not BoolExpr
|And BoolExpr BoolExpr
|Or BoolExpr BoolExpr
deriving(Show)
-- evaluates an expression
evaluate :: BoolExpr -> [Variable] -> Bool
evaluate T _ = True
evaluate F _ = False
evaluate (Var v) vs = v `elem` vs
evaluate (Not e) vs = not (evaluate e vs)
evaluate (And e1 e2) vs = evaluate e1 vs && evaluate e2 vs
evaluate (Or e1 e2) vs = evaluate e1 vs || evaluate e2 vs
--here is the function
variables :: BoolExpr -> [Variable]
variables (Or T F) = []
variables (And T F) = []
variables (Var a)= [a]
variables (Or (Var a) (Var b)) =[a]++[b]
variables (And (Var a) (Var b))=[a]++[b]
variables T = []
variables F = []
subsets :: [Variable] -> [[Variable]]
subsets [] = [[]]
subsets (x:xs) = [zs | ys <- subsets xs, zs <- [ys, (x:ys)]]
input : variables (And (Var 'a') (Or (Var 'c') (Var 'b')))
output: Non-exhaustive patterns in function variables
expected output: "abc"
other test cases:
input:variables (And (Var 'a') (Or (Var 'a') (Var 'a')))
expected output: "a"
`