【问题标题】:SML - Error: right-hand-side of clause doesn't agree with function result type [circularity]SML - 错误:子句的右侧与函数结果类型不符 [循环性]
【发布时间】:2013-02-25 20:04:46
【问题描述】:

考虑以下代码:

fun g(a) =
let     fun h(b)=g(a) 
in  h end; 

当我在 SML 中运行它时,我得到:

- fun g(a) =
= let   fun h(b)=g(a)
= in    h end;
stdIn:55.5-57.10 Error: right-hand-side of clause doesn't agree with function re
sult type [circularity]
  expression:  'Z -> 'Y
  result type:  'Y
  in declaration:
    g = (fn a => let val <binding> in h end)

我无法理解这里的问题:g(a) return h,但是 我在声明 fun g(a) 中没有看到任何特定的返回值(即没有什么像 fun g(a):int) ,那为什么会出错呢?

谢谢

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    由于g 有一个参数,它的类型为'X -&gt; 'Y

    h(b) = g(a)表示hg必须有相同的结果类型'Y,
    h 的类型为 'Z -&gt; 'Y

    因此,g(x),对于'X 类型的任何x,必须具有'Y 类型。
    但是g(x)的返回值是h,其类型为'Z -&gt; 'Y
    这意味着'Y必须和'Z -&gt; 'Y是同一类型,这是不可能的。

    正如 SML 所说,'Z -&gt; 'Yh 的类型)与 'Yg(a) 的类型)不一致。

    如果你尝试手工解决,你会发现

    g 1 
    

    将是一个函数h 这样

    h 3
    

    的值
    g 1
    

    这是一个函数h,这样......

    等等,无限期地。

    【讨论】:

      【解决方案2】:

      ML 类型推理系统首先将您的函数 g 识别为一个表达式,该表达式接受 'Z 并返回 'Y。但随后它看到 g 的结果类型只是 'Y 并且也是早期绑定 h 的结果类型。可以预期会看到 Z -> Z->Y 类型的绑定。但是,您的函数闭包有一个自身的环境。所以就像这样绑定g。

      fun g a= g
      

      如果你的闭包有一个也是它自己的环境,ML 类型推断就无法猜测类型。

      您可以按如下方式声明这些函数。

      fun g(a) =
          let     
          fun h(b)=g(a) 
          in  
          h(a)
          end; 
      

      好像

      fun g a = g a
      

      这一次你的闭包只有一个主体。但这没有任何意义......只是一个为什么你会得到循环错误的例子。

      【讨论】:

      • 然后,你有一个函数承诺返回你想要的任何东西。但只有当它返回时......
      • 你同意上面的解释吗?如果你批评我对闭包的理解,我会很高兴
      • 这里没问题,我绝对同意你的观点,但想补充一点,像 g a = g a 这样的函数没有任何意义 - 还是在 SML 中?
      • 不,这只是一个例子。是的,这没有任何意义。
      猜你喜欢
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多