首页 文章

不到SML中的功能

提问于
浏览
1

我在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 回答

  • 0

    关于第一个问题, fn (a, b) => ... a 是下一个元素, b 是累加器 . 由于您将 eb 进行比较,因此e被引用为 bool 类型 . 您应该将 ea 进行比较,并在它变为_2657086时永不覆盖 b

    fun exists (e, L) =
        foldl (fn (a, b) => e = a orelse b) false L
    

    对于第二个问题,您可以使用 foldr/foldl 来执行此操作 . 它与第一个例子类似;从空列表开始作为累加器,并在该元素小于阈值时为其添加元素 .

    作为权衡, foldr 为您提供了正确的顺序,但它不是尾递归的 . 另一方面, foldl 是尾递归的,但是以相反的顺序给出结果列表 .

  • 3

    要查看元素是否在列表中,请尝试以下方法: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);

    祝好运!!

相关问题