今天我們提到了類型變量。但我不明白它的意思。我只能在wiki上找到一個解釋,type variable什麼是haskell中的類型變量/ Java
我理解數學中的解釋,但仍然不知道編程。任何人都可以給出解釋嗎?
今天我們提到了類型變量。但我不明白它的意思。我只能在wiki上找到一個解釋,type variable什麼是haskell中的類型變量/ Java
我理解數學中的解釋,但仍然不知道編程。任何人都可以給出解釋嗎?
使用Type變量,您可以爲非指定類型的事物(Numbers,Text,...)定義數據類型/容器。爲了提供一個簡單的例子,想象一下,你需要一個Box,在那裏你可以放入任何你想要的東西。
這裏是在Java中的例子(T是類型變量):
public class Box<T> {
private T thing;
public void putThing(T thing) {
this.thing = thing;
}
}
這裏是在Haskell一個例子(一個是類型變量):
data Box a = PutThing a
另一個好例子將是一個通用的元組數據類型。
例usecases
注意,在兩種情況下,類型變量現在指定的類型。
的Java:
Box<String> box = new Box<String>();
box.putThing("42");
哈斯克爾(在ghci中):
:t (PutThing (42::Int))
(PutThing (42::Int)) :: Box Int
類型變量是一種通過編寫單個函數/方法來處理多種不同類型值的方法。這是在Haskell一個例子:
id :: forall a. a -> a
id x = x
在類型簽名的a
是一個類型變量,而作爲forall
意味着,這個函數是「所有」不同的類型。例如,您可以使用id
,就好像它的類型爲Int -> Int
或者好像它的類型爲Char -> Char
一樣。
id (5 :: Int) = 5 :: Int
id 'a' = 'a'
如果id
被賦予了具體的類型,如id :: Int -> Int
(沒有在它的類型變量的意思),然後id 'a'
將是一個類型的錯誤,因爲'a'
的類型(Char
)不匹配Int
。
通常,我們省略了forall
(id :: a -> a
),因爲它可以很容易地從使用類型變量中推斷出來,但它有助於理解實際發生的情況。
我不像Haskell那麼瞭解Java,但泛型似乎是一種使用類型變量的方式,所以ArrayList<A>
意味着一個數組列表,它適用於任何非原始類型A
。
Java通用類型不適用於原始類型,它們是編譯時類型的安全系統(在編譯時它們通常被清除*)。所以他們在任何意義上都不是「純粹的」...... –
@ElliottFrisch你是什麼意思,他們不適用於原始類型?我不能使用ArrayList
不可以。您不能使用'ArrayList
好吧,這很容易。基本的觀察是,我們不僅具有像Int和Bool和Char這樣的基本類型,而且還包含由其他類型組成的類型。
最簡單的例子是列表。在類型安全的語言中,列表中的所有元素必須具有相同的類型。這就是爲什麼我們寫:
Haskell Java Explanation
[Int] List<Integer> list of integers
[Char] List<Character> list of characters
等等。這很好,但不夠好。事實證明,除了元素類型,列表中的某些函數是完全相同的,並且元素類型在函數內部是不相關的。下面是一個例子:
lengthIntList :: [Int] -> Int -- compute length of a list of int
lengthIntList [] = 0
lengthIntList (x:xs) = 1 + length xs
lengthCharList :: [Char] -> Int -- compute length of a list of char
lengthCharList [] = 0
lengthCharList (x:xs) = 1 + length xs
因此,下一個步驟是從元素類型抽象和說:
length :: [a] -> Int -- length of a list, for all elemen types
length [] = 0
length (x:xs) = 1 + length xs
這裏,a
是一種類型的變量表示:對於所有類型的,這功能length
獲取該類型的列表並返回Int
。
從維基百科該實施例可以用Java編寫這樣
public static <T> T identity(T a) {
return a;
}
其中a
類型被綁定到類型參數T
。因此,當您撥打Integer
致電身份識別功能時,您會收到一個Integer
,當您撥打String
時,您會收到String
。
一個非常常見的用法的例子是像字符串的列表相同類型的值的集合:
List<String> as = new ArrayList<String>();
在List
接口類型參數綁定到String
因此該列表中的所有元素必須類型爲String
。
更新代碼片段,謝謝Elliott。
你的例子裏有什麼't'?你是不是指'回來一個;'? –
我認爲你只是要找到適合類型變量ocaml的例子,他們不是在數學意義上的實現Java的。當我聽到haskell時,我認爲[monad](https://wiki.haskell.org/Monad)(但我並不真正瞭解haskell)。 –
*我們*在哪裏提及類型變量?無論如何,你問的是一個Java泛型類型變量,也被稱爲「[類型參數](https://docs.oracle.com/javase/tutorial/java/generics/types.html)」(⇐鏈接到「 Java™教程「)? – Andreas
@Andreas那麼,剛纔對你來說...... –