标准ML:简化递归调用

时间:2015-08-12 20:02:01

标签: functional-programming sml

我的书有以下inorder遍历的定义(它在列表中以inorder顺序计算一个包含树元素的列表:

fun trav Empty = []
    | trav(Node(t_1, x, t_2)) = trav t_1 @ (x::trav t_2);

简化第二行(即trav t_1x::trav t_2)中的呼叫的惯例/标准是什么?我知道我在使用@运算符之前简化了它们,但是我想知道第一个trav调用是否在另一个调用之前完全评估,反之亦然(不太可能),或者两者同时发生

由于

bclayman

1 个答案:

答案 0 :(得分:1)

你的直觉是正确的,trav t_1首先得到评估,因为函数参数按从左到右的顺序进行评估。这似乎有点奇怪,因为@是一个中缀运算符,但[1, 2, 3] @ [4, 5, 6]实际上可以重写为(op @)([1, 2, 3], [4, 5, 6])。您可以通过执行以下操作来验证@首先评估其左参数:

Standard ML of New Jersey v110.78 [built: Sun Jun  7 20:21:33 2015]
- (print "test1\n"; [1, 2, 3]) @ (print "test2\n"; [4, 5, 6]);
test1
test2
val it = [1,2,3,4,5,6] : int list
- 

基本上你拥有的东西相当于:

fun trav Empty = []
  | trav(Node(t_1, x, t_2)) = 
     let val l = trav t_1 
         val r = trav t_2
     in l @ (x::r) end