我在ocaml中转换后续算法时遇到问题为了实现这个算法,我使用了Set.Make(String)
functor的实际进出2个函数任何人都可以在ocaml中为我提供percise代码帮助
这实际上是Algo for Live Variables[PDF] ..帮助会非常受欢迎
for all n, in[n] = out[n] = Ø
w = { set of all nodes }
repeat until w empty
n = w.pop( )
out[n] = ∪ n’ ∈ succ [n] in[n’]
in[n] = use[n] ∪ (out[n] — def [n])
if change to in[n],
for all predecessors m of n, w.push(m)
end
答案 0 :(得分:4)
for all n, in[n] = out[n] = Ø
w = { set of all nodes }
repeat until w empty
n = w.pop( )
out[n] = ∪ n’ ∈ succ [n] in[n’]
in[n] = use[n] ∪ (out[n] — def [n])
if change to in[n],
for all predecessors m of n, w.push(m)
end
我很难说出这里到底发生了什么。我认为您的文字存在一些对齐问题 - repeat until w empty
应该重复下一个5行,对吗?如何进出功能,它们看起来像阵列?除了这些不足之外,我将解决我所遵循的一些一般规则。
我必须将C和Fortran算法中的一些数值方法翻译成函数式语言,我有一些建议。
0)定义正在使用的数据类型。这将真正帮助您完成下一步(扰流板:寻找功能构造)。一旦了解了数据类型,就可以更准确地定义最终应用的功能结构。
1)寻找功能性构造。折叠,递归和地图,以及何时使用它们。例如,for all predecessors m
是一个折叠(不确定它是否会折叠在树或列表上,但不是一个折叠)。 While
循环是递归的好地方 - 但不要担心它是尾调用,您可以稍后修改参数以符合这些要求。不要担心100%纯净。删除足够的不纯的构造(引用或数组)以便以功能的方式感知算法。
2)编写算法的任何部分。将函数留空,添加虚拟值,然后实现您所知道的 - 然后您可以提出更好,更明智的问题。
3)重写它。您很可能错过了一些功能构造或使用了数组或引用,您现在意识到可以使用列表或集合或通过累加器。你可能已经定义了一个列表,但是后来你意识到你不能随意访问它(好吧,它会非常不利),或者它需要被前后遍历(拉链的好地方)。无论哪种方式,当你最终得到它时,你会知道,你的脸上应该有一个巨大的耳朵到耳朵的笑容。