haskell/Java中的类型变量是什么

haskell/Java中的类型变量是什么,java,haskell,Java,Haskell,今天我们提到了类型变量。但我不明白这是什么意思。我在维基上只能找到一个解释 我理解数学中的解释,但仍然对编程一无所知。有人能解释一下吗?类型变量是一种通过编写一个函数/方法来实现多态性的方法,该函数/方法可以处理多种不同类型的值。以下是Haskell的一个例子: id :: forall a. a -> a id x = x 类型签名中的a是一个类型变量,正如forall所暗示的,该函数“适用于所有”不同类型。例如,您可以像使用类型Int->Int一样使用id,或者像使用类型Char->

今天我们提到了类型变量。但我不明白这是什么意思。我在维基上只能找到一个解释


我理解数学中的解释,但仍然对编程一无所知。有人能解释一下吗?

类型变量是一种通过编写一个函数/方法来实现多态性的方法,该函数/方法可以处理多种不同类型的值。以下是Haskell的一个例子:

id :: forall a. a -> a
id x = x
类型签名中的
a
是一个类型变量,正如
forall
所暗示的,该函数“适用于所有”不同类型。例如,您可以像使用类型
Int->Int
一样使用
id
,或者像使用类型
Char->Char
一样使用

id (5 :: Int) = 5 :: Int
id 'a' = 'a'
如果给了
id
一个具体的类型(意思是其中没有类型变量),比如
id::Int->Int
,那么
id'a'
将是一个类型错误,因为
'a'
的类型(
Char
)与
Int
不匹配

通常,我们省略了所有(
id::a->a
)的
,因为它可以很容易地从类型变量的使用中推断出来,但它有助于理解实际情况


我对Java的了解不如Haskell,但泛型似乎是使用类型变量的一种方式,因此
ArrayList
意味着数组列表可以用于任何非基元类型
a

类型变量是一种通过编写单个函数/方法来实现多态性的方式,该函数/方法可以用于多种不同类型的值。以下是Haskell的一个例子:

id :: forall a. a -> a
id x = x
类型签名中的
a
是一个类型变量,正如
forall
所暗示的,该函数“适用于所有”不同类型。例如,您可以像使用类型
Int->Int
一样使用
id
,或者像使用类型
Char->Char
一样使用

id (5 :: Int) = 5 :: Int
id 'a' = 'a'
如果给了
id
一个具体的类型(意思是其中没有类型变量),比如
id::Int->Int
,那么
id'a'
将是一个类型错误,因为
'a'
的类型(
Char
)与
Int
不匹配

通常,我们省略了所有
id::a->a
)的
,因为它可以很容易地从类型变量的使用中推断出来,但它有助于理解实际情况


我对Java的了解不如Haskell,但泛型似乎是使用类型变量的一种方式,因此
ArrayList
意味着一个数组列表,它适用于任何非基本类型
a

嗯,这很简单。基本观察结果是,我们不仅有Int、Bool和Char等基本类型,还有由其他类型组成的类型

最简单的例子是列表。在类型安全语言中,列表的所有元素必须具有相同的类型。这就是为什么我们写:

Haskell   Java               Explanation
[Int]     List<Integer>      list of integers
[Char]    List<Character>    list of characters
因此,下一步是从元素类型中提取,并说:

length :: [a] -> Int       -- length of a list, for all elemen types
length [] = 0
length (x:xs) = 1 + length xs

这里,
a
是一个类型变量,表示:对于所有类型,此函数
length
获取该类型的列表,并返回一个
Int

很简单。基本观察结果是,我们不仅有Int、Bool和Char等基本类型,还有由其他类型组成的类型

最简单的例子是列表。在类型安全语言中,列表的所有元素必须具有相同的类型。这就是为什么我们写:

Haskell   Java               Explanation
[Int]     List<Integer>      list of integers
[Char]    List<Character>    list of characters
因此,下一步是从元素类型中提取,并说:

length :: [a] -> Int       -- length of a list, for all elemen types
length [] = 0
length (x:xs) = 1 + length xs

这里,
a
是一个类型变量,表示:对于所有类型,此函数
length
获取该类型的列表,并返回一个
Int

wikipedia中的示例可以这样用Java编写

public static <T> T identity(T a) {
    return a;
}
列表
界面中的类型参数绑定到
字符串
,因此该列表的所有元素必须为
字符串
类型


更新的代码片段,谢谢Elliott。

维基百科的示例可以用Java编写,如下所示

public static <T> T identity(T a) {
    return a;
}
列表
界面中的类型参数绑定到
字符串
,因此该列表的所有元素必须为
字符串
类型


更新的代码片段,谢谢Elliott。

使用类型变量,您可以为非指定类型的内容(数字、文本等)定义数据类型/容器。举个简单的例子,想象一下,你想要一个盒子,你可以在里面放任何你想要的东西

以下是Java中的一个示例(T是类型变量):

另一个很好的例子是通用元组数据类型


示例用例

注意,在这两种情况下,类型变量现在都是指定的类型

爪哇:


使用类型变量,您可以为非指定类型的内容(数字、文本等)定义数据类型/容器。举个简单的例子,想象一下,你想要一个盒子,你可以在里面放任何你想要的东西

以下是Java中的一个示例(T是类型变量):

另一个很好的例子是通用元组数据类型


示例用例

注意,在这两种情况下,类型变量现在都是指定的类型

爪哇:


我认为您只会找到类型变量的ocaml示例,它们在Java中没有实现数学意义。当我听到haskell时,我想(但我不太了解haskell)。我们在哪里提到类型变量?无论如何,您是在询问Java泛型类型变量,也称为“”(⇐ 链接到“Java™ 教程“?@Andreas,刚才对你来说…@ScaryWombat,因为我认为在适当的地方使用范围更好的词(如
字段
参数
),考虑到
变量
的含义太广,为了防止混淆/错误交流,这并不意味着我是纳粹一个词错误的代码发生在错误的沟通中,所以作为一个好的程序员,你应该支持我-P@Andreas我应该意识到幽默并不总是在网络上起作用。我想你只会找到类型变量的ocaml示例,他们说
:t (PutThing (42::Int))
(PutThing (42::Int)) :: Box Int