我在SML遇到了两个令人困惑的问题,并希望有人可以帮助我:
第一个是一个函数,它接受一个元素和一个列表,并决定该元素是否存在于列表中,这是我试图编写的代码:
fun member (e,L) = foldl (fn(a,b) => if (e = b) then true else false) false L;
但我得到了bool *'列表 - > bool但我需要的是''a *''列表 - >布尔
对于第二个,它还需要一个元素和一个列表,但返回的元素列表少于传递的元素。我不确定是否应该通过map或foldr / foldl来完成。 有什么建议吗?
提前致谢:)
答案 0 :(得分:3)
关于第一个问题,fn (a, b) => ...
a
是下一个元素,b
是累加器。由于您将e
与b
进行了比较,因此推测其类型为bool
。您应该将e
与a
进行比较,并在b
变为true
时永远不会覆盖fun exists (e, L) =
foldl (fn (a, b) => e = a orelse b) false L
:
foldr/foldl
对于第二个问题,您可以使用foldr
来执行此操作。它与第一个例子类似;从空列表开始作为累加器,并在该元素小于阈值时为其前置一个元素。
作为权衡,foldl
为您提供正确的顺序,但它不是尾递归的。另一方面,{{1}}是尾递归的,但是以相反的顺序给出结果列表。
答案 1 :(得分:0)
查看元素是否在列表中是否尝试这样: 有趣的elementExist(e,nil)= false | elementExist(e,x :: xs)=如果e = x orelse elementExist(e,xs)则为true,否则为false;
第二个从列表中删除现有元素:
有趣的elFromList(e,nil)= [] | elFromList(e,x :: xs)= if e = x then elFromList(e,xs)else x :: elFromList(e,xs);
祝你好运!!