Suppose I want to model a tree structure in Haskell with
data Tree = Null | Node Tree Integer Tree deriving Show
and I'd like to test if every entry is, say, less than 10. I thought I would use pattern matching and write
isSmall :: Tree -> Bool
isSmall _
| Null = True
| (Node a b c) = if b >= 10
then False
else isSmall a && isSmall c
However it gives errors about a
, b
, and c
being out of scope. I would have thought putting them in the guards would basically put them in the scope. Is this not how you're supposed to do pattern matching in Haskell? I've looked around for examples that would guide me but I haven't found any examples of pattern matching in guards that uses a data structure composed of several other data structures.
The error:
test.hs:24:6: Not in scope: data constructor ‘Node’
test.hs:24:11: Not in scope: ‘a’
test.hs:24:13: Not in scope: ‘b’
test.hs:24:15: Not in scope: ‘c’
test.hs:24:27: Not in scope: ‘b’
test.hs:26:38: Not in scope: ‘a’
test.hs:26:57: Not in scope: ‘c’
if
, but it doesn't look like you're trying to replace theif
. – Maffaif A then False else B
better written asnot A && B
. – Cleavland