gpt4 book ai didi

list - SML:如何将一个函数传递给一个列表并返回删除所有负实数的列表?

转载 作者:行者123 更新时间:2023-12-04 05:15:06 27 4
gpt4 key购买 nike

这是我到目前为止所得到的......

fun positive l1 = positive(l1,[],[])
| positive (l1, p, n) =
if hd(l1) < 0
then positive(tl(l1), p, n @ [hd(l1])
else if hd(l1) >= 0
then positive(tl(l1), p @ [hd(l1)], n)
else if null (h1(l1))
then p

是的,这是出于我的教育目的。我在大学上 ML 课,我们必须编写一个程序来返回列表中的最大整数,我想超越它,看看我是否也可以从中删除积极因素。

另外,如果可能的话,谁能指点我一本像样的机器学习书籍或入门书?我们的课文根本没有很好地解释事情。

最佳答案

你没有提到你的代码没有输入。

您的第一个函数子句只有变量 l1 ,在递归中使用。然而在这里它被用作三元组的第一个元素,作为参数给出。这与 SML 使用的 Hindley-Milner 类型系统并不真正齐头并进。以下非正式想法可能会更好地说明这一点:

让我们先假设 l1类型为 'a ,因此该函数必须接受该类型的参数并返回未知的'a -> ... .然而,在右边你创建一个参数 (l1, [], [])其类型必须为 'a * 'b list * 'c list .但由于它作为参数传递给函数,这也意味着 'a等于 'a * 'b list * 'c list ,显然不是这样。

显然这不是你的初衷。似乎您的意图是拥有一个以列表作为参数的函数,然后同时拥有一个递归辅助函数,该函数需要两个额外的累积参数,即原始列表中的正数和负数列表。

为此,您至少需要为您的辅助函数指定另一个名称,这样它的定义就不会重新绑定(bind)原始函数的定义。
然后你有一些选项,关于这个辅助函数应该在哪个范围内。一般来说,如果除了从“主”函数调用这个辅助函数没有任何意义,那么它不应该放在“主要”功能之外的范围。这可以使用这样的 let 绑定(bind)来完成:

fun positive xs = 
let
fun positive' ys p n = ...
in
positive' xs [] []
end

这样辅助函数 positives'不能在 positive 之外调用功能。

有了这个照顾,您的原始代码就会出现更多问题。
  • 由于您只返回正整数列表,因此无需跟踪
    消极的。
  • 您应该使用模式匹配来分解列表元素。这样你就可以消除
    使用取列表的头部和尾部,还需要验证是否真的存在
    列表中的头部和尾部。
    fun foo []      = ... (* input list is empty *)
    | foo (x::xs) = ... (* x is now the head, and xs is the tail *)
  • 只要可以避免使用附加运算符( @ )(始终可以),则不应使用它。
    问题是当你的左手有一个巨大的列表时,它的运行时间很糟糕
    侧和右侧的小列表(通常是右侧的情况,如
    它主要用于附加单个元素)。因此,它通常应该被认为是坏的
    练习使用它。

    然而,对此有一个非常简单的解决方案,即始终连接元素
    在列表前面(以相反的顺序构建列表),然后只是反转列表
    当它作为最后一件事返回时(按预期顺序制作):
    fun foo [] acc = rev acc
    | foo (x::xs) acc = foo xs (x::acc)

  • 鉴于这些小注释,我们最终得到了一个看起来像这样的函数
    fun positive xs =
    let
    fun positive' [] p = rev p
    | positive' (y::ys) p =
    if y < 0 then
    positive' ys p
    else
    positive' ys (y :: p)
    in
    positive' xs []
    end

    关于list - SML:如何将一个函数传递给一个列表并返回删除所有负实数的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14386055/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com