gpt4 book ai didi

scala - 我将如何在 Function1 或 PartialFunction 上实现加宽函数

转载 作者:行者123 更新时间:2023-12-04 04:35:21 27 4
gpt4 key购买 nike

我想在 Function1 或 PartialFunction 上定义一个加宽函数。

我想这样做是因为我有一个类似于以下的用例:

class A
class B extends A

def foo(fun: Function[B, A]) = {
bar(fun.widen[A])
}

def bar(pf: PartialFunction[A, A]) = ???

从上面可以看出,为了实现这一点,我想定义一个加宽函数,如下所示:
implicit class AugmentedFunction[T, U](fun: T => U) {
def widen[T1 >: T]: PartialFunction[T1, U] = { case t: T => fun(t) }
}

但不幸的是,由于删除,这不起作用。我尝试研究使用 TypeTags,但似乎无法以令编译器满意的方式表达这一点。

澄清:
当我说它不起作用时,我的意思是它在使用时抛出异常(参见 ScalaKata 代码片段),而实际上它不应该抛出异常并在 ScalaKata 上的代码片段的特定情况下打印“未定义”。

我的问题 :

我怎样才能正确解决这个问题? Scalaz 或 Shapeless 中是否已经存在我不知道的此类功能?首先这样做有意义吗?

这是包含所有代码的片段: http://www.scalakata.com/527bb729e4b0b1a1c4db1a73

最佳答案

我认为您可以使用类 list 来做到这一点:

implicit class AugmentedFunction[T, U](fun: T => U)(implicit m: Manifest[T]) {
def widen[T1](implicit m1: Manifest[T1]): PartialFunction[T1, U] = {
case a if(m <:< m1) => fun(a.asInstanceOf[T])
}
}

class A
class B extends A
class C

val theFun: B => A = (b: B) => b

theFun.widen[A].isDefinedAt(new B) // true
theFun.widen[C].isDefinedAt(new C) // false

关于scala - 我将如何在 Function1 或 PartialFunction 上实现加宽函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19827830/

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