У меня есть логическое абстрактное синтаксическое деревоПолучить поддеревьев из аст
type bast =
True
| False
| Not of bast
| Or of bast * bast
| And of bast * bast
и я хочу, чтобы применить на него функции и получить все поддеревья, которые возвращают верно для этой функции.
Моя попытка:
let findtrees f (ast: bast) =
let rec findtree (tree: bast) (mylist: bast list) = match tree with
| True ->
if (f tree)=true then [email protected][tree] else []
| False ->
if (f tree)=true then [email protected][tree] else []
| Not e -> Not (findtree e subtrees)
| And (e1,e2) -> And (findtree e1 mylist, findtree e2 mylist)
| Or (e1,e2) -> Or (findtree e1 mylist, findtree e2 mylist)
in findtree ast []
Я получаю сообщение об ошибке:
Error: The variant type list has no constructor Not
Пробовал также с этим:
let findtrees f (ast: bast) =
let rec findtree (tree: bast) (mylist: bast list) = match tree with
(True|False) -> mylist
| subtree ->
if (f subtree)=true then
[email protected][subtree]
else
select_tree subtree mylist
in findtree ast []
отлично компилируется, но никогда не заканчивается!
попробуйте использовать '| Not (e) -> Not (findtree e subtrees) ' –
та же ошибка, @ChrisStewart – eternalStudent
вы, вероятно, захотите вернуть' mylist @ [Not (findtree e subtrees)] 'или более просто' (Not (findtree e subtrees)): : mylist', если вам не нужен порядок результатов. То же самое касается 'And' и' Or' в следующих матчах. – didierc