【问题标题】:Why do types 'a and ''Z not match up in SML?为什么类型 'a 和 ''Z 在 SML 中不匹配?
【发布时间】:2013-01-03 16:12:42
【问题描述】:

我有以下递归函数:

fun tester (f:'a -> 'b, tl:(string * 'a * 'b) list) =
    case tl of
    [] => []
     | (t, c, e)::rest => 
       let val tr = f (c)
       in
           if tr <> (e)
           then ((t), (e), tr)::(tester (f, rest))
           else tester (f, rest)
       end;

加载时出现“错误:运算符和操作数不同意 [UBOUND 匹配]”:

lec1test.sml:17.5-19.26 Error: operator and operand don't agree [UBOUND match]
  operator domain: ''Z * ''Z
  operand:         'b * 'Y
  in expression:
    tr <> e

uncaught exception Error
  raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27
             ../compiler/TopLevel/interact/evalloop.sml:44.55
             ../compiler/TopLevel/interact/evalloop.sml:296.17-296.20

我发现我认为它与 tr 的通用绑定有关,但我不明白为什么这是个问题。我将tr 分配给来自f 的函数值,它返回'b。然后我将结果与元组中的最后一个值进行比较,该值也是'b 类型。有人可以解释为什么这会给我一个错误吗?

【问题讨论】:

    标签: sml


    【解决方案1】:

    并非所有类型都支持相等运算符=&lt;&gt;,只有所谓的相等类型。例如,intstring listbool * unit 是相等类型,但例如函数类型t -&gt; u 永远不会,因为没有合理的(可确定的)方法来比较函数。

    'a 这样的多态类型的值也不是相等类型,因为类型变量可以被任何类型实例化。要获得仅限于相等类型的多态类型,您需要编写一个带有双勾号的类型变量,例如''a.

    在您的情况下,将第一行更改为

    fun tester (f : ''a -> ''b,  tl : (string * ''a * ''b) list) =
    

    应该为你解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 2020-12-24
      • 1970-01-01
      • 2013-12-24
      • 2018-09-02
      相关资源
      最近更新 更多