不到SML中的功能

时间:2012-03-23 11:35:33

标签: sml smlnj

我在SML遇到了两个令人困惑的问题,并希望有人可以帮助我:

第一个是一个函数,它接受一个元素和一个列表,并决定该元素是否存在于列表中,这是我试图编写的代码:

fun member (e,L) = foldl (fn(a,b) => if (e = b) then true else false) false L;

但我得到了bool *'列表 - > bool但我需要的是''a *''列表 - >布尔

对于第二个,它还需要一个元素和一个列表,但返回的元素列表少于传递的元素。我不确定是否应该通过map或foldr / foldl来完成。 有什么建议吗?

提前致谢:)

2 个答案:

答案 0 :(得分:3)

关于第一个问题,fn (a, b) => ... a是下一个元素,b是累加器。由于您将eb进行了比较,因此推测其类型为bool。您应该将ea进行比较,并在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);

祝你好运!!