Scala 类型语法
Scala Type Syntax
我观察到,如果我想创建一个可以接受任何类型列表和 return 布尔值的通用函数,我可以使用以下语法进行函数声明:
def someFunction[A](l:List[A]):Boolean
但是,我也可以用这种语法实现等效的函数声明:
def someFunction(l:List[_]):Boolean
后一种语法对我来说很有意义;下划线表示任何类型列表的通配符。但是前者令人困惑;如果有的话,这两种语法之间的语义区别是什么?注意:我注意到我可以使用 [B] 或 [c] 甚至 [%] 代替第一个语法示例中的“[A]”。
A
是 "type parameter"。就像值参数一样,例如您的 l
传递参数,它是 "name" 或占位符,对于某些可能在不同时间不同的类型(即方法的不同调用) .
在你的例子中,A
没有被使用,所以,是的,使用 _
更有意义也更清晰,但是如果你要 return 列表中的一个元素,那么方法 return 类型将是 A
(或您想要为该参数指定的任何名称)。使用 _
作为 return 类型没有任何意义。
List[_]
是 List[X] forSome {type X <: Any}
的无约束 existential type 和 shorthand(类似于 Java 中的 List<?>
)。
在这种情况下,我认为函数类型(不是 Scala 语法)forall A. List[A] -> Boolean
和 (exists A. List[A]) -> Boolean
表示相同的东西,因为在这两种情况下你只能检查 "shape"清单的;这些类型之间可能存在等价关系。
我观察到,如果我想创建一个可以接受任何类型列表和 return 布尔值的通用函数,我可以使用以下语法进行函数声明:
def someFunction[A](l:List[A]):Boolean
但是,我也可以用这种语法实现等效的函数声明:
def someFunction(l:List[_]):Boolean
后一种语法对我来说很有意义;下划线表示任何类型列表的通配符。但是前者令人困惑;如果有的话,这两种语法之间的语义区别是什么?注意:我注意到我可以使用 [B] 或 [c] 甚至 [%] 代替第一个语法示例中的“[A]”。
A
是 "type parameter"。就像值参数一样,例如您的 l
传递参数,它是 "name" 或占位符,对于某些可能在不同时间不同的类型(即方法的不同调用) .
在你的例子中,A
没有被使用,所以,是的,使用 _
更有意义也更清晰,但是如果你要 return 列表中的一个元素,那么方法 return 类型将是 A
(或您想要为该参数指定的任何名称)。使用 _
作为 return 类型没有任何意义。
List[_]
是 List[X] forSome {type X <: Any}
的无约束 existential type 和 shorthand(类似于 Java 中的 List<?>
)。
在这种情况下,我认为函数类型(不是 Scala 语法)forall A. List[A] -> Boolean
和 (exists A. List[A]) -> Boolean
表示相同的东西,因为在这两种情况下你只能检查 "shape"清单的;这些类型之间可能存在等价关系。