这些功能有什么不同?
问题描述:
我有一个功能:这些功能有什么不同?
fn x => x
现在,参数x被应用到真实和INT(例如(X:真))。所不同的是,什么是对两个功能相同,即使他们似乎有效地做同样的事情:
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
答
这两个函数需要x和输出x的输入。
然而,在第一功能的输入x为铸造为类型INT的,而第二浇铸是类型真实的。
因此,第一个功能是(int -> int)
类型和第二个(real -> real)
。
答
在1和2,你是不是应用功能,您指定的类型。为了应用该功能,请写(fn x => x) 5
和fn x => x) 5.0
。当您执行这个函数应用程序时,x确实被推断为具有您明确写入的类型。
以下两个函数的区别在于它们采用不同的类型。这两种功能之间的相似之处在于它们对输入的做法是相同的,即它们只是将其退回。
* [Casted](https://en.wikipedia.org/wiki/Type_conversion)*(或类型转换)是错误的词语,因为它意味着数据表示会改变。这里没有类型转换。 –