haskell - Recursively adding to binary tree -
i'm trying recursively add binary tree in haskell. i'm following learn haskell on this, few changes, i'm getting errors, not understand:
data male = male { malename :: string , maledob :: int } deriving (show, read, eq, ord) data female = female { femalename :: string , femaledob :: int } deriving (show, read, eq, ord) data familytree = emptytree | node (familytree female) (familytree male) deriving (show, read, eq, ord) singleton :: -> familytree singleton x = node x emptytree emptytree treeinsert :: (ord a) => -> familytree -> familytree treeinsert x emptytree = singleton x treeinsert x (node left right) | x == = node x left right | x < = node (treeinsert x left) right | x > = node left (treeinsert x right)
here error message i'm getting:
couldn't match type `female' `male' expected type: male actual type: in first argument of `treeinsert', namely `x' in third argument of `node', namely `(treeinsert x right)' in expression: node left (treeinsert x right)
i'm quite new haskell , can't wrap head around happening here. pointer in right direction welcome!
when write
treeinsert :: ord => -> familytree -> familytree
the type system ensures type of first argument equals index of second. means can insert male
in tree starts male
. guess, not want.
however it's nice question , i'll answer it. problem in
treeinsert :: ord => -> familytree -> familytree
is a
far general. would
treeinsert :: int -> familytree int -> familytree int
mean? need restrict a
either female
or male
. that's job gadts
:
{-# language gadts #-} data person pfemale :: female -> person female pmale :: male -> person male
person
contains either female
or male
, carries @ type level information one. having can define
runperson :: person -> runperson (pfemale x) = x runperson (pmale x) = x treeinsert :: person -> familytree -> familytree treeinsert p emptytree = singleton (runperson p) treeinsert p@(pfemale x) (node left right) | x == = node x left right | otherwise = treeinsert p left treeinsert p@(pmale x) (node left right) | x == = node x left right | otherwise = treeinsert p right
the trick when pattern match on person a
a
gets instantiated either female
or male
, never else. when a
female
, continue insert "female
" subtree, otherwise — "male
".
Comments
Post a Comment