【问题标题】:Foldl return a Tuple in SML?Foldl 在 SML 中返回一个元组?
【发布时间】:2012-04-01 05:27:12
【问题描述】:

我正在处理的问题需要输入一个整数列表并返回这些数字的平均值。它需要适合看起来像这样的特定格式...

fun average (n::ns) =
let
val (a,b) = fold? (?) ? ?
in
real(a) / real(b)
end;

我只能替换问号,不能使用任何内置函数。我有一个可行的解决方案,但它不符合这些规则。

fun average (n::ns) =
    let
        val (a,b) = ((foldl (fn(x, y)=>(x+y)) n ns), length(ns)+1)
    in
        real(a) / real(b)
    end;

那么,有没有办法让折叠函数返回一个元组?像这样的事情是我想要它做的,但显然我不能这样做......

val (a,b) = ((foldl (fn(x, y)=>(x+y), count++) n ns)

【问题讨论】:

    标签: functional-programming sml smlnj


    【解决方案1】:

    foldl 的返回类型是初始累加器的类型。所以这里的想法是提供一个元组,包括列表中元素的总和和计数:

    fun average (n::ns) =
        let
            val (a, b) = foldl (fn (x, (sum, count)) => (sum+x, count+1)) (n, 1) ns
        in
            real(a) / real(b)
        end
    

    请注意,如果列表为空,您的解决方案将失败,最好添加另一种处理空列表的情况(返回 0.0 或抛出自定义异常):

    fun average [] = 0.0
      | average (n::ns) = (* the same as above *)
    

    【讨论】:

    • 谢谢。我明白你对空列表的看法。除此之外,我现在收到此错误...错误:运算符和操作数不同意 [重载] 运算符域:('Z * int)* 'Z -> 'Z 操作数:('Z * int)* 'Z -> 'Z * int
    • @MCR:查看我的更新,我已经更正了参数的顺序。
    • 谢谢。效果很好,现在很有意义。
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 2019-03-07
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    相关资源
    最近更新 更多