在Scala函数中使用Type参数

时间:2016-06-16 01:46:23

标签: scala functional-programming

我试图在Scala中实现布尔类型,我找到了一个使用此签名的示例:

abstract class Boolean {
   def ifThenElse[T](t : => T , e : => T) : T

   ... }

我的问题是:

  1. 我们应该在函数名之后使用类型参数,例如这个funcName [T]。

  2. t:=>是什么意思?

  3. 谢谢

1 个答案:

答案 0 :(得分:2)

至于第一个问题:

  

1.我们应该在函数名之后使用类型参数,如funcName [T]

如果你想要这个函数可以使用不同的类型,那么将函数名称后面的泛型类型设置为funcName[T]是很明智的。例如,你有一个像这样的函数

def myFunction[T](param1: T){/*process*/}

您希望将参数param1param2传递给myFunction。这两个参数定义如下

val param1: Int = 10 
val param2: String = "test"

虽然param1param2的类型不同,但您可以调用函数myFunction(param1)myFunction(param2)

然后,让我们谈谈第二个问题

  

2.T:=> T是什么意思?

这是一个by-name parameter。那是什么?以下为您提供更多详细信息:

t: => Tt: () => T的含义相同,而不是输入() => T字样,您可以选择=> T作为t

另一个例子:如果你想要一个断言,你可以定义这样的函数:

def myAssert(predicate: () => Boolean) = 
    if(!predicate()) throw new AssertionError

然后您可以将其用作以下

myAssert(() => 5 > 3)

用法太难看了,是吗?您可能希望像这样使用它

myAssert(5 > 3)

此时,by-name parameter将在舞台上。只需在by-name parameter

的帮助下定义您的功能即可
def myAssert(predicate: => Boolean) = //leave out '()'
    if(!predicate) throw new AssertionError //leave out '()'

然后,您可以使用上面的myAssert

myAssert(5 > 3)

注释:只允许参数使用名称类型,其中省略了空参数列表()。没有名字变量或副名字段。

祝你好运。