2017-03-17 29 views
0

今天我們提到了類型變量。但我不明白它的意思。我只能在wiki上找到一個解釋,type variable什麼是haskell中的類型變量/ Java

我理解數學中的解釋,但仍然不知道編程。任何人都可以給出解釋嗎?

+0

我認爲你只是要找到適合類型變量ocaml的例子,他們不是在數學意義上的實現Java的。當我聽到haskell時,我認爲[monad](https://wiki.haskell.org/Monad)(但我並不真正瞭解haskell)。 –

+0

*我們*在哪裏提及類型變量?無論如何,你問的是一個Java泛型類型變量,也被稱爲「[類型參數](https://docs.oracle.com/javase/tutorial/java/generics/types.html)」(⇐鏈接到「 Java™教程「)? – Andreas

+1

@Andreas那麼,剛纔對你來說...... –

回答

0

使用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 
1

類型變量是一種通過編寫單個函數/方法來處理多種不同類型值的方法。這是在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

通常,我們省略了forallid :: a -> a),因爲它可以很容易地從使用類型變量中推斷出來,但它有助於理解實際發生的情況。

我不像Haskell那麼瞭解Java,但泛型似乎是一種使用類型變量的方式,所以ArrayList<A>意味着一個數組列表,它適用於任何非原始類型A

+0

Java通用類型不適用於原始類型,它們是編譯時類型的安全系統(在編譯時它們通常被清除*)。所以他們在任何意義上都不是「純粹的」...... –

+0

@ElliottFrisch你是什麼意思,他們不適用於原始類型?我不能使用ArrayList '嗎? [* Haskell中的所有*類型信息在運行時被刪除](http://stackoverflow.com/questions/12468722/does-haskell-erase-types),所以它們在這方面是相似的。這對這種「純粹」的任何事情有何影響?如果你的意思是純粹的「沒有副作用」,我不明白這是如何適用於此。 – Lazersmoke

+0

不可以。您不能使用'ArrayList '或*'ArrayList '。你必須使用包裝類型。 –

2

好吧,這很容易。基本的觀察是,我們不僅具有像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

2

從維基百科該實施例可以用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。

+0

你的例子裏有什麼't'?你是不是指'回來一個;'? –

相關問題