我有一个功能:
fn x => x
现在,参数x应用于实数和整数(例如(x:real))。这两个函数有什么不同之处和相同之处,即使它们看起来实际上在做相同的事情:
1. fn (x:int) => x;
2. fn (x:real) => x;
这三个都是身份函数,但后两个不是多态的。
非多态版本的功能不完全相同-一个具有类型int -> int
,另一个具有类型real -> real
,因此它们只能分别应用于int
和real
。
例子:
Standard ML of New Jersey v110.79 [built: Wed Oct 7 00:59:52 2015]
fn (x:int) => x;
val it = fn : int -> int
- fn (x:real) => x;
val it = fn : real -> real
- (fn (x:int) => x) 3;
val it = 3 : int
- (fn (x:int) => x) 3.0;
stdIn:2.1-2.22 Error: operator and operand don't agree [tycon mismatch]
operator domain: int
operand: real
in expression:
(fn x : int => x) 3.0
- (fn (x:real) => x) 3;
stdIn:1.2-1.22 Error: operator and operand don't agree [overload conflict]
operator domain: real
operand: [int ty]
in expression:
(fn x : real => x) 3
- (fn (x:real) => x) 3.0;
val it = 3.0 : real
相反,多态版本适用于所有内容:
- fn x => x;
val it = fn : 'a -> 'a
- (fn x => x) 3.0;
val it = 3.0 : real
- (fn x => x) 3;
val it = 3 : int
- (fn x => x) "hello";
val it = "hello" : string
- (fn x => x) [1,2,3];
val it = [1,2,3] : int list
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句