gpt4 book ai didi

sml - 为什么类型 'a and ' 'Z 在 SML 中不匹配?

转载 作者:行者123 更新时间:2023-12-04 23:53:34 25 4
gpt4 key购买 nike

我有以下递归函数:

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 的通用绑定(bind)有关,但我不明白为什么这是个问题。我正在分配 trf 中的函数值,返回 'b .然后我将结果与元组中的最后一个值进行比较,该值也是 'b 类型。 .有人可以解释为什么这会给我一个错误吗?

最佳答案

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

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

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

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

应该为你修复它。

关于sml - 为什么类型 'a and ' 'Z 在 SML 中不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14424540/

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