我在SML中遇到了两个令人困惑的问题,希望有人可以帮助我:
第一个是一个函数,它接受一个元素和一个列表,并决定该元素是否存在于列表中,这是我试图编写的代码:
fun member (e,L) = foldl (fn(a,b) => if (e = b) then true else false) false L;
但我得到了bool *'列表 - > bool但我需要的是''a *''列表 - > bool
至于第二个,它还需要一个元素和一个列表,但返回的元素列表少于传递的元素 . 我不确定是否应该通过map或foldr / foldl来完成 . 有什么建议?
提前致谢 :)
2 回答
关于第一个问题,
fn (a, b) => ...
a
是下一个元素,b
是累加器 . 由于您将e
与b
进行比较,因此e被引用为bool
类型 . 您应该将e
与a
进行比较,并在它变为_2657086时永不覆盖b
:对于第二个问题,您可以使用
foldr/foldl
来执行此操作 . 它与第一个例子类似;从空列表开始作为累加器,并在该元素小于阈值时为其添加元素 .作为权衡,
foldr
为您提供了正确的顺序,但它不是尾递归的 . 另一方面,foldl
是尾递归的,但是以相反的顺序给出结果列表 .要查看元素是否在列表中,请尝试以下方法:fun 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);
祝好运!!