Wre*_*all 3 polymorphism ml sml
例如:
fun example (a:'a list) : list = a
Run Code Online (Sandbox Code Playgroud)
将签名:
'a list -> 'a list
Run Code Online (Sandbox Code Playgroud)
如果我以不同的方式定义但具有相同的内容,该怎么办
fun example (a : ''a list) : list = a
Run Code Online (Sandbox Code Playgroud)
它的签名将是:
''a list -> ''a list
Run Code Online (Sandbox Code Playgroud)
有什么不同?
And*_*erg 18
像普通类型变量'a可以用任意类型代替.表单''a是一个所谓的相等类型变量,这意味着它只能被允许在其值上使用相等运算符=(或<>)的类型替换.
例如,这个功能:
fun contains(x, []) = false
| contains(x, y::ys) = x = y orelse contains (x, ys)
Run Code Online (Sandbox Code Playgroud)
不能有类型,'a * 'a list -> bool因为它使用相等x.它被赋予更严格的类型''a * ''a list -> bool.
大多数类型的允许平等,但有些却没有,例如real,exn和特别,任何函数类型t -> u.记录,元组或数据类型等组合类型如果所有组件都这样,则允许相等.
旁注:Haskell后来将这个概念概括为类型类的概念,它允许在类型上使用任意用户定义的约束.等式类型变量由Eq类型类替换.