我有一個功能:這些功能有什麼不同?
fn x => x
現在,參數x被應用到真實和INT(例如(X:真))。所不同的是,什麼是對兩個功能相同,即使他們似乎有效地做同樣的事情:
1. fn (x:int) => x;
2. fn (x:real) => x;
我有一個功能:這些功能有什麼不同?
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)*(或類型轉換)是錯誤的詞語,因爲它意味着數據表示會改變。這裏沒有類型轉換。 –