【问题标题】:What is the difference between 'a and ''a in SML?SML中的'a和'a有什么区别?
【发布时间】:2013-12-24 14:36:00
【问题描述】:

例如:

fun example (a:'a list) : list = a

将有以下签名:

'a list -> 'a list 

如果我用不同的方式定义它,但内容相同,比如

fun example (a : ''a list) : list = a

它的签名将是:

''a list -> ''a list

有什么区别?

【问题讨论】:

    标签: polymorphism sml ml


    【解决方案1】:

    'a 这样的普通类型变量可以替换为任意类型。 ''a 形式是一个所谓的相等类型 变量,这意味着它只能被允许在其上使用相等运算符=(或<>)的类型替换价值观。

    例如这个函数:

    fun contains(x, [])    = false
      | contains(x, y::ys) = x = y orelse contains (x, ys)
    

    不能有类型'a * 'a list -> bool,因为它在x 上使用相等。它被赋予了更严格的类型''a * ''a list -> bool

    大多数类型允许相等,但有些则不允许,例如 realexn,尤其是任何函数类型 t -> u。如果记录、元组或数据类型等组合类型的所有组件都允许相等,则它们承认相等。

    旁注:Haskell 后来将此概念推广到其类型类 的概念,它允许对类型进行任意用户定义的此类约束。相等类型变量被Eq 类型类替换。

    【讨论】:

    • 谢谢!这很有帮助。我现在正在学习标准的 ML NJ 课程。我之前只有一些python经验。为什么真实类型不能使用相等运算符?
    • IEEE 定义的浮点等价不是等价关系(因为它在 NaN 和 -0 上的行为)。因此,它会破坏通用相等运算符的各种属性。如果您真的需要 IEEE 平等,可以使用 Real.==。 (但是,由于浮点计算的不精确性,在实践中对浮点使用相等是一个坏主意。)
    • @Wei Wang:除了 Andrea 的回答,您可以查看 SML 的 eqtype 关键字,该关键字可用于签名。它的目的是断言出现在签名中的这种带注释的类型是 equality 类型,正如 Andrea 所解释的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 2019-01-12
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多