我有一个迭代的 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
使用这两个函数,我需要编写一个返回两个列表交集的单行函数。任何帮助或建议将不胜感激!
我有一个迭代的 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
使用这两个函数,我需要编写一个返回两个列表交集的单行函数。任何帮助或建议将不胜感激!
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