gpt4 book ai didi

function - 带有隐式的 Scala 函数式文字

转载 作者:行者123 更新时间:2023-12-02 19:06:48 24 4
gpt4 key购买 nike

如果其他地方已经有人问过这个问题,请原谅我。我有一个涉及函数值和隐式参数的 Scala 语法问题。

我很乐意将隐式与 Scala 的柯里化(Currying)功能一起使用。例如,如果我有一个 sum 函数并希望将第二个参数设为隐式:

scala> def sum(a: Int)(implicit b: Int) = a + b
sum: (a: Int)(implicit b: Int)Int

有没有办法使用函数值语法来做到这一点?暂时忽略隐含的内容,我通常会像这样编写柯里化(Currying)函数值:

scala> val sum2 = (a: Int) => (b: Int) => a + b
sum: (Int) => (Int) => Int = <function1>

但是,第二种方法中的函数签名有很大不同(柯里化(Currying)被显式表达)。仅仅将隐式关键字添加到 b 没有多大意义,编译器也会提示:

scala> val sum2 = (a: Int) => (implicit b: Int) => a + b
<console>:1: error: '=>' expected but ')' found.
val sum2 = (a: Int) => (implicit b: Int) => a + b
^

此外,从第一种方法中部分应用求和来获取函数值也会导致问题:

scala> val sumFunction = sum _
<console>:14: error: could not find implicit value for parameter b: Int
val sumFunction = sum _
^

这使我相信具有隐式参数的函数必须在创建函数值时确定所述参数,而不是在稍后应用函数值时确定。事实真的如此吗?您可以将隐式参数与函数值一起使用吗?

感谢您的帮助!

最佳答案

scala>  val sum2 = (a: Int) => {implicit b: Int => a + b}
sum2: (Int) => (Int) => Int = <function1>

这只会使 b 成为函数体范围的隐式值,因此您可以调用需要隐式 Int 的方法。

我认为函数不能有隐式参数,因为这样就不清楚函数是什么。是 Int => Int 还是 () => Int

我发现的最接近的是:

scala> case class Foo(implicit b: Int) extends (Int => Int) {def apply(a: Int) = a + b}
defined class Foo

scala> implicit val b = 3
b: Int = 3

scala> Foo()
res22: Foo = <function1>

scala> res22(2)
res23: Int = 5

关于function - 带有隐式的 Scala 函数式文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6326132/

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