我有在SML两个列表,可以说,名单A [(a,b,c),(d,e,f)]和B名单[b,e].我想计算B中与B中每个三元组的第二个元素匹配的每个项目的出现次数.输出应该是2.因为b并且e每个在A中出现一次.
到目前为止这是我的代码,但是当我从B中的一个元素移动到另一个元素时,我的计数器总是设置为0.我知道在Java中这只是一个简单的双循环.
fun number_in_months (d : (int * int * int ) list, m : (int) list) =
if null m then 0
else if null d then number_in_months(d, tl m)
else if (#2(hd d)) = (hd m) then 1 + number_in_months (tl d, m)
else number_in_months(tl d, m)
Run Code Online (Sandbox Code Playgroud)
代码不会在递归调用之间累积值.可能还有其他逻辑错误.
使用递归和函数累积值是一种常见的模式,您可以在这里阅读更多信息.它的本质是使用head和解析列表,tail直到列表为空并在每次调用时累积一些值.sum下面的函数是一个简单的例子来说明这一点.这可以适应你的例子,以便acc在何时b或被e发现时积累list A.
fun sum(numbers: (int) list) =
let fun sumR(numbers: (int) list, acc: int) =
if null numbers
then acc
else
sumR(tl numbers, hd numbers + acc)
in
sumR(numbers, 0)
end
Run Code Online (Sandbox Code Playgroud)
跑步[1,2,3]给出:
val sum = fn : int list -> int
- sum([1,2,3]);
val it = 6 : int
Run Code Online (Sandbox Code Playgroud)
注意我对这个答案有意模糊,因为这是关于编程语言课程的Coursera作业的问题.