gpt4 book ai didi

scala - Scala 中函数组合的好语法

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

我想得到一种像 Haskell 的 desort = (reverse . sort) 一样高效的语法。在 Scala 中......这是我的尝试:

implicit class Composition[A,B,C](val g: A => B) {
def o(f: B => C): A => C = { a:A => f(g(a))}
}

val fg = cos _ o sin

有什么办法可以摆脱 _在gf的声明中?

最佳答案

对于函数,是的,但对于方法,不是。您的问题是您正在尝试使用 g 的方法,而不是函数。对于函数,已经有一个名为 andThen 的方法。 :

val f: Int => Int = _ + 1
val g: Int => String = _.toString

scala> val fg = f andThen g
fg: Int => String = <function1>

scala> fg(2)
res3: String = 3

你自己的隐式类也可以使用(虽然我没有查看你想要的确切语义),使用像 f 这样的函数。和 g ,正如我定义的那样。它甚至适用于函数和方法(按此顺序)。
def a(i: Int): Int = i + 1
def b(i: Int): String = i.toString

scala> f andThen a
res4: Int => Int = <function1>

然而, a andThen b不能按原样工作,因为 a是一种方法,不能调用 andThen在。为了使用 andThen , a需要转换为函数,这不会自动发生,因为函数不一定是预期的。 a _ andThen b eta-扩展 a成一个函数,其中有一个方法叫做 andThen , 并且可以提供 b 的参数(一个方法),因为编译器会隐式转换 b到函数,因为函数是唯一期望作为 andThen 参数的东西. Function不是唯一具有名为 andThen 的方法的类型,因此编译器不能期望 100% 的时间为 a 进行从方法到函数的转换。 .

关于scala - Scala 中函数组合的好语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41372059/

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