gpt4 book ai didi

generics - 通用类型统一 : multiple parameters (T, T) 与多个参数列表 (T)(T)?

转载 作者:行者123 更新时间:2023-12-02 21:40:32 27 4
gpt4 key购买 nike

我对柯里化(Currying)和非柯里化(Currying)泛型函数之间类型检查的差异有点困惑:

scala> def x[T](a: T, b: T) = (a == b)
x: [T](a: T, b: T)Boolean
scala> def y[T](a: T)(b: T) = (a == b)
y: [T](a: T)(b: T)Boolean

我的直觉是 x(1, "one")y(1)("one") 都应该给出类型错误,但我错了:

scala> x(1, "one")
res71: Boolean = false
scala> y(1)("one")
<console>:9: error: type mismatch;
found : java.lang.String("one")
required: Int
y(1)("one")
^

起初我以为正在进行某种隐式转换,但事实似乎并非如此:

scala> x(1 :Int, "one" :String)
res73: Boolean = false

所以这是怎么回事?我的直觉应该是什么?

最佳答案

Scala 尝试一次确定一个参数 block 的类型。如果添加另一个参数并部分应用,您可以看到这一点:

def x[T](a: T, b: T)(c: T) = (a == b)
scala> x(1, "one") _
res0: Any => Boolean = <function1>

当然,IntString都是Any(并且==是在上定义的)任何)。

早期 block 中未使用的类型参数仍可在后续 block 中自由使用:

def y[T,U](a: T)(b: U)(c: (T,U)) = (a == b)
scala> y(1)("one")
res1: (Int, java.lang.String) => Boolean = <function1>

您还可以使用较早的 block 作为后面 block 的默认值!

def z[T,U](a: T)(b: U)(c: (T,U) = (a,b)) = (c._1 == c._2)
scala> z(1)("one")()
res2: Boolean = false

因此,将参数分布在多个参数 block 中会对类型推断和默认(以及部分应用)产生影响。

关于generics - 通用类型统一 : multiple parameters (T, T) 与多个参数列表 (T)(T)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8749439/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com