【发布时间】:2016-01-19 16:02:04
【问题描述】:
我有一个函数:
fn x => x
现在,参数 x 应用于 real 和 int(例如 (x:real))。这两个函数有什么不同和什么相同,尽管它们似乎有效地做同样的事情:
1. fn (x:int) => x;
2. fn (x:real) => x;
【问题讨论】:
我有一个函数:
fn x => x
现在,参数 x 应用于 real 和 int(例如 (x:real))。这两个函数有什么不同和什么相同,尽管它们似乎有效地做同样的事情:
1. fn (x:int) => x;
2. fn (x:real) => x;
【问题讨论】:
这两个函数都接受 x 的输入和 x 的输出。
但是,在第一个函数中,输入 x 被转换为为 int 类型,而第二个被转换为 real 类型>.
因此第一个函数的类型是(int -> int),第二个函数是(real -> real)。
【讨论】:
这三个都是恒等函数,但后两个不是多态的。
非多态版本的作用并不完全相同——一个是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
【讨论】:
在 1. 和 2. 中,您不是在应用函数,而是在指定类型。为了应用这个功能,写(fn x => x) 5和fn x => x) 5.0。当你执行这个函数应用程序时,x 确实被推断为具有你显式编写的类型。
您下面的两个函数之间的区别在于它们采用不同的类型。这两个函数的相似之处在于它们对输入的处理方式相同,即只是将其返回。
【讨论】: