gpt4 book ai didi

scala - 在 scala 中拉皮条我的函数 - 对函数应用隐式转换

转载 作者:行者123 更新时间:2023-12-01 08:40:53 27 4
gpt4 key购买 nike

当我想使用隐式方法将函数转换为其他东西时,我遇到了一些问题。

出于测试目的,我正在 Scala 2.8 中实现一个小型 DSL。它应该支持对实例的各种检查(如果你愿意,可以断言)。整个 DSL 有点复杂,但下面的简化示例说明了我的问题:

object PimpMyFunction {

class A(val b: Int)

def b(a: A) = a.b

class ZeroCheck(f: A => Int) {
def isZeroIn(a: A) = f(a) == 0
}

implicit def fToCheck(f: A => Int): ZeroCheck = new ZeroCheck(f)

def main(args: Array[String]) {
val a0 = new A(0)
val a1 = new A(1)

println(fToCheck(b).isZeroIn(a0))
println(fToCheck(b).isZeroIn(a1))

println(b.isZeroIn(a0))
}
}

前两行 println (当我显式调用转换方法时)编译并工作正常,但最后一行(当我想依赖隐式时)产生错误:
编译错误:在对象 PimpMyFunction 中缺少方法 b 的参数;如果您想将其视为部分应用的功能,请在此方法后面加上'_'
如果我想以同样的方式隐式转换“普通”实例(不是函数),那么我猜这个问题与范围/导入无关。

如果我按照错误消息的说明使用 println((b _).isZeroIn(a0)) 它也可以,但是 DSL 是针对非技术人员的,所以我会喜欢保持语法尽可能简洁。

我想我有另一个解决方法(b 应该是一个扩展 Assertions trait 的类,它已经包含检查方法 + A => Int),它将支持更简洁的语法,但它会更冗长且不太灵活,所以我更喜欢隐式的方式。

任何想法如何避免 (b _) 语法并仍然使用隐式?

最佳答案

Scala 要求您编写 (b _) 以确保您确实希望将方法 b 装箱为函数值。如果不想写下划线,直接将b定义为函数值而不是方法:

val b = (a: A) => a.b

关于scala - 在 scala 中拉皮条我的函数 - 对函数应用隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3288385/

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