gpt4 book ai didi

scala - 从 Scala API 中消除身份包装器类型

转载 作者:行者123 更新时间:2023-12-04 18:00:40 26 4
gpt4 key购买 nike

假设我试图“抽象执行”:

import scala.language.higherKinds

class Operator[W[_]]( f : Int => W[Int] ) {
def operate( i : Int ) : W[Int] = f(i)
}

现在我可以定义一个 Operator[Future]Operator[Task]等等,例如...
import scala.concurrent.{ExecutionContext,Future}
def futureSquared( i : Int ) = Future( i * i )( ExecutionContext.global )

在 REPL 风格...
scala> val fop = new Operator( futureSquared )
fop: Operator[scala.concurrent.Future] = Operator@105c54cb

scala> fop.operate(4)
res0: scala.concurrent.Future[Int] = Future(<not completed>)

scala> res0
res1: scala.concurrent.Future[Int] = Future(Success(16))

万岁!

但我也可能想要一个简单的同步版本,所以我在某处定义
type Identity[T] = T

我可以定义一个同步运算符......
scala> def square( i : Int ) : Identity[Int] = i * i
square: (i: Int)Identity[Int]

scala> val sop = new Operator( square )
sop: Operator[Identity] = Operator@18f2960b

scala> sop.operate(9)
res2: Identity[Int] = 81

甜的。

但是,结果的推断类型是 Identity[Int] 很尴尬。 ,而不是更简单、直接的 Int .当然,这两种类型实际上是相同的,因此在各方面都相同。但我希望我图书馆的客户不要对这种抽象过度执行的东西一无所知。

我可以手工写一个包装...
class SimpleOperator( inner : Operator[Identity] ) extends Operator[Identity]( inner.operate ) {
override def operate( i : Int ) : Int = super.operate(i)
}

这确实有效...
scala> val simple = new SimpleOperator( sop )
simple: SimpleOperator = SimpleOperator@345c744e

scala> simple.operate(7)
res3: Int = 49

但这感觉非常锅炉板,特别是如果我的抽象过度执行类有很多方法而不是只有一个。而且我必须记住随着泛型类的发展保持包装器同步。

是否有一些更通用的、可维护的方法来获取 Operator[Identity] 的版本?这使得包含类型从类型推断和 API 文档中消失?

最佳答案

这更多是长评论而不是答案......

But, it's awkward that the inferred type of the result is Identity[Int], rather than the simpler, straightforward Int. Of course the two types apparent types are really the same, and so are identical in every way. But I'd like clients of my library who don't know anything about this abstracting-over-execution stuff not to be confused.



这听起来像是要转换 Indentity[T]返回 T ...你考虑过类型归属吗?

scala>def f[T](t: T): Identity[T] = t

scala>f(3)
// res11: Identity[Int] = 3

scala>f(3): Int
// res12: Int = 3

// So in your case
scala>sop.operate(9): Int
// res18: Int = 81

关于scala - 从 Scala API 中消除身份包装器类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56609748/

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