gpt4 book ai didi

scala - 按名称参数如何在高阶函数中工作?

转载 作者:行者123 更新时间:2023-12-04 15:12:52 25 4
gpt4 key购买 nike

我试图了解按名称类型注释在高阶函数的上下文中意味着什么。下面是一个例子:

object Test { 
def apply[A, B](f: (=> A) => B, x: => A): B = f(x)
def const[A](ignored: A): Int = 1
val res: Int = apply(const, ???)
}
const它的参数是严格的(即它缺少 => 注释),那么为什么它不强制它的参数(在这种情况下是 ???)并引发异常?

这里有描述语义的论文吗?

我在这里寻找权威答案。

最佳答案

论据 f在您的 apply函数是 Funcion1它采用类型为 A 的按名称调用参数并返回 B .因此,f(x)不会评估 call-by-name 参数 x ,但将其引用直接传递给 f .

有助于理解res如下:

def res[C]: Int = apply[C, Int](const, ???)

在您的示例中 C将是一个不特定的类型。现在为 const 推断的类型参数是什么?在这一行?是 => C .不幸的是,您不能键入该参数:
def res[C]: Int = apply[C, Int](const[=> C], ???)  // illegal syntax

但是您可以验证发生了什么:
def res[C]: Int = apply[C, Int](const[Nothing], ???)

给你
<console>:10: error: type mismatch;
found : Nothing => Int
required: => C => Int
def res[C]: Int = apply[C, Int](const[Nothing], ???)
^

此类型出现在 const 中作为 Function0[Int] (因此 Scala 隐式地将按名称调用或“thunk”参数视为没有参数的函数)。您可以再次验证这一点:
def const[A](ignored: A): Int = if (ignored.isInstanceOf[Function0[_]]) 1 else 0

现在 Test.res会给你 1 (意味着 ignored 确实是 Function0 )。

因此,以不同的方式回答问题, const有一个类型为 A 的热切参数,但这在这里无关紧要,因为 A在您的示例中成为一个函数,并且您永远不会应用该函数,因此 ???永远不会被执行。

some debate至于 why there is both Scala 中的“thunk”或无括号函数和空括号函数( Function0 )。

关于scala - 按名称参数如何在高阶函数中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16094523/

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