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
获取该类型的列表,并返回一个Intwikipedia中的示例可以这样用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