【问题标题】:Less than function in SMLSML 中的小于函数
【发布时间】:2012-04-07 23:19:59
【问题描述】:

我在 SML 中遇到了 2 个令人困惑的问题,希望有人能帮助我:

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

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

但我得到 bool * 'a list --> bool 但我需要的是 ''a * ''a list --> bool

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

提前致谢:)

【问题讨论】:

  • 请注意,if (e = b) then true else false 只是 e = b 本身的一种复杂表达方式。

标签: sml smlnj


【解决方案1】:

查看一个元素是否在列表中试试这个: 有趣的 elementExist(e, nil) = false | elementExist(e, x::xs) = if e = x orelse elementExist(e, xs) then true else false;

第二个从列表中删除现有元素:

fun elFromList(e, nil) = [] | elFromList(e, x::xs) = if e = x then elFromList(e, xs) else x::elFromList(e, xs);

祝你好运!!

【讨论】:

    【解决方案2】:

    关于第一个问题,fn (a, b) => ... a 是下一个元素,b 是累加器。由于您将eb 进行比较,因此推断e 的类型为bool。你应该比较ea,当它变成true时,永远不要覆盖b

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

    对于第二个问题,您可以使用foldr/foldl 这样做。它类似于第一个示例;您从空列表作为累加器开始,并在该元素小于阈值时为其添加一个元素。

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

    【讨论】:

    • 非常感谢 :) 我也设法使用 foldl 解决了第二个问题
    • if e = a then true else b可以简写为e = a orelse b。 ;)
    • @AndreasRossberg:谢谢,我根据您的建议更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多