Recursion SML-使用连续体在trie中收集单词

Recursion SML-使用连续体在trie中收集单词,recursion,sml,trie,smlnj,continuation,Recursion,Sml,Trie,Smlnj,Continuation,我有一个 数据类型trie=字符*(trie ref)列表的节点|空 我想收集trie中的所有单词,使用这两个相互递归的函数: words_in_trie: trie -> (char list list -> 'a) -> 'a all_words: trie ref list -> (char list list -> 'a) -> 'a 然后给他们打电话 fun all_entries t=all_单词t(fn l=>map(fn w=>String

我有一个 数据类型trie=字符*(trie ref)列表的节点|空 我想收集trie中的所有单词,使用这两个相互递归的函数:

words_in_trie: trie -> (char list list -> 'a) -> 'a

all_words: trie ref list -> (char list list -> 'a) -> 'a
然后给他们打电话 fun all_entries t=all_单词t(fn l=>map(fn w=>String.intlode w)l)

这必须通过延续来完成。我以非延续形式写了它,如下所示:

fun wt Empty = [[]] 
    |wt (Node(c,rl)) = map (fn (l) => c::l) (aw rl)
and aw [] = []
    |aw [h] = wt (!h)
    |aw (h::t) = (wt (!h))@(aw t)
但我不知道如何将它们转换为延续形式! 这是我目前为止所做的,但它不起作用:

fun words_in_trie Empty cont = cont[] 
    |words_in_trie (Node(c,rl)) cont = (all_words rl (fn r=> cont(c::r)))
and all_words [h] cont = words_in_trie (!h) cont
    |all_words (h::t) cont = (words_in_trie (!h) cont)@(all_words t cont)

这件事我已经做了很久了,如果有人能帮我,我将不胜感激

由于continuation的输入是单词的后缀,您知道在调用下一个continuation之后,结果必须更接近trie中的单词列表,并且仍然是单词的后缀。您可以使用它来确定continuation应该做的是在trie上的下一个字母前加一个字符(给定一个char list列表,它将在列表中的每个char list前加一个char)

如果要传递的trie是空的,那么该trie中有一个单词,这是一个空字符串。您想要的结果是
[“”]
。回想一下,最后一个连续符将列表中的每个
字符列表
转换为
字符串
,因此为了获得该结果,您需要向其传递一个带有空
字符列表的列表
,以便进行转换

|words_in_trie (Node(c,rl)) cont = (all_words rl (fn r=> cont(c::r)))
回忆:延续的类型是
字符列表->'a
c
是一个
char
,因此不能在
r
前面加上它,后者属于
char list
类型

all_words
返回包含在try
rl
列表中的所有单词的列表,您要将continuation应用于该列表(在trie的所有字符之前)。您必须建立连续性,以便除了从trie上的节点中预加所有字符外,它还从当前节点中预加
char
c
。你要找的是这样的东西:

fn x => cont (map (fn y => c::y) x)
上述操作将
c
前置到列表中的每个
char list
,然后将其传递到下一个continuation,该continuation将继续前置下一个
char


您的
所有单词
函数在我看来都很好。

标准ML本身没有连续体。你是在使用,还是其他地方的类似模块,或者是一些自制的东西?使用一个函数(char list->'a)作为输入的一个列表列表,表示它收集的单词后缀,所以第二种情况下的
all_words
也不是CPS形式。我知道这是一个很晚的回复,但是谢谢你的回答!这是一个很大的帮助。
fn x => cont (map (fn y => c::y) x)