Ask for explanation  possibly repeated
 Benoit de Boursetty
[
Home
]
[ Index:
by date

by threads
]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
Date:  19991208 (19:59) 
From:  Benoit de Boursetty <debourse@e...> 
Subject:  Ask for explanation  possibly repeated 
Hi My question must already have been asked, but the error I get from the compiler does not seem to be listed in the documentation ("This kind of expression is not allowed as righthand side of `let rec'") So here's the situation. I have a basic, standard structure for trees. # type 'a classical_tree = Classical_node of 'a * 'a classical_tree list And now I'd like to move to another tree structure (cyclic by default) where each node or leaf points to its parent node, if there is one. So I want to use the following type: # type 'a tree = Node of 'a tree option * 'a * 'a tree list which means: Node (parent node, data, sons). I can easily create such typed values by hand: # let rec root = Node (None, 0, [son1; son2]) and son1 = Node (Some root, 1, []) and son2 = Node (Some root, 2, []);; But I can't manage to write the translation function from the first type to the second one in a purely applicative fashion. It is intuitive to write: # let translate_tree = let rec aux father (Classical_node (data, sons)) = let rec this_node = Node (father, data, List.map (aux (Some this_node)) sons) in this_node in aux None but of course this doesn't work ("This kind of expression is not allowed as righthand side of `let rec'", as they say) and I understand why. It's because the contents of "this_node", not yet defined, could be looked at in function "aux". In fact this is a correct algorithm only because argument "father" is not accessed to in function "aux". So, is there an applicative workaround? I know how to do it with mutable values / references, but... Benoit de Boursetty.