1

我有一个迭代的 foldr 函数:

fun iterFold f v [] = v
 |   iterFold f v (x::xs) = iterFold f (f(v,x)) xs;

还有一个接受谓词和列表的函数。该函数将列表与谓词进行比较,如果出现一次,则返回 true。

fun exist3 p M = foldr( fn(x,y) => y orelse (p x)) false M

使用这两个函数,我需要编写一个返回两个列表交集的单行函数。任何帮助或建议将不胜感激!

4

1 回答 1

0

I have an iterative foldr function.

不是foldr,而是foldl。不同之处在于foldr从列表的最后一个元素到第foldl一个元素,从列表的第一个元素到最后一个元素。

他们编写函数的方式:

fun intersect ls1 ls2 = iterFold (fn (is,l1) =>
                                    if exist3 (fn (l2) => l1 = l2) ls2
                                    then l1::is
                                    else is)
                                 [] ls1

(您可以将其格式化为单行,但我认为您的意思是它应该调用一个函数)

这个想法是通过ls1并添加到结果元素中ls2。由于我们是从第一个元素到最后一个元素,结果列表中的元素将按照与它们在中的顺序相反的顺序出现ls1

- intersect [1,2,3] [1,2,3];
val it = [3,2,1] : int list
- intersect [2,4,5] [1,2,3,5];
val it = [5,2] : int list
于 2013-10-04T22:52:01.030 回答