【问题标题】:right-hand-side of clause doesn't agree with function result type [literal]子句的右侧与函数结果类型不一致 [字面量]
【发布时间】:2013-10-31 16:23:10
【问题描述】:

我正在尝试使用动态编程计算二项式系数。我不断收到此错误

fun binomial(m:int, n:int, DP) =
if n = m orelse n = 0 then 
    Array2.update(DP, m, n, 1)
else if Array2.sub(DP, m, n) = ~1 then ( 
    if Array2.sub(DP, m-1, n) = ~1 then
        Array2.update(DP, m-1, n, binomial(m-1, n, DP))
    else 
        Array2.update(DP, m-1, n, Array2.sub(DP, m-1, n));
    if Array2.sub(DP, m-1, n-1) = ~1 then
        Array2.update(DP, m-1, n-1, binomial(m-1, n-1, DP))
    else
        Array2.update(DP, m-1, n-1, Array2.sub(DP, m-1, n-1));
    let
        val k = Array2.sub(DP, m-1, n) + Array2.sub(DP, m-1, n-1);
    in
        Array2.update(DP, m, n, k)
    end
)
else
    Array2.update(DP, m, n, Array2.sub(DP, m, n));
Array2.sub(DP, m, n)

我不明白这个错误想说什么。

6.5-25.48 Error: right-hand-side of clause doesn't agree with function result type     [literal]
expression:  unit
result type:  int
in declaration:
binomial =
  (fn (<pat> : int,<pat> : int,DP) =>
        if <exp> orelse <exp>
        then Array2.update <exp>
        else if <exp> then <exp> else <exp>)

谁能帮帮我?

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    您的函数binomial 返回Array2.update 的结果,即unit。但是您将此返回值作为最后一个参数传递给Array2.update,它期望int

    编辑:哦,现在我明白了...您唯一的问题是最后一行 (Array2.sub(DP,m,n)) 不是您的函数的一部分 - 如果您想构建表达式列表,您需要用括号。所以不是

    fun binomial (m,n,DP) = <update logic>; Array2.sub(DP,m,n)
    

    你想要的

    fun binomial (m,n,DP) = (<update logic>; Array2.sub(DP,m,n))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 2021-12-25
      • 2021-03-18
      • 2014-05-02
      相关资源
      最近更新 更多