【问题标题】:Overcoming erasure case study; currying Maps克服擦除案例研究;柯里化地图
【发布时间】:2020-02-17 06:20:13
【问题描述】:

我一直在为以下 Scala 代码苦苦挣扎

def curry[A,B,C,U](m: Map[(A,B,C),U], a: A): Map[(B,C),U] = m.collect { case ((aa,b,c),v) if aa == a => (b,c) -> v }
def curry[A,B,C,U](m: Map[(A,B,C),U], b: B): Map[(A,C),U] = m.collect { case ((a,bb,c),v) if bb == b => (a,c) -> v }

我无法编译它,因为擦除后两个函数都是相同的,我不得不求助于糟糕的解决方法(如curry1curry2curry12 等)

错误:双重定义: def curry[A, B, C, U](m: Map[(A, B, C),U], a: A): Map[(B, C),U] 在第 152 行和 def curry[A, B, C, U](m: Map[(A, B, C),U], b: B): Map[(A, C),U] 在第 153 行 擦除后具有相同的类型: (m: scala.collection.immutable.Map, a: Object)scala.collection.immutable.Map def curry[A,B,C,U](m: Map[(A,B,C),U], b: B): Map[(A,C),U] = m.collect { case (( a,bb,c),v) 如果 bb == b => (a,c) -> v }

有没有办法让它工作?可怕的情况允许可怕的解决方案(也许是反射和 TypeTags?)

【问题讨论】:

    标签: scala


    【解决方案1】:

    解决方法:

    def curry[A,B,C,U](m: Map[(A,B,C),U], a: A): Map[(B,C),U] = m.collect { case ((aa,b,c),v) if aa == a => (b,c) -> v }
    def curry[A,B,C,U](m: Map[(A,B,C),U], b: B, dummy: Int = 0): Map[(A,C),U] = m.collect { case ((a,bb,c),v) if bb == b => (a,c) -> v }
    

    或者:

    def curry[A,B,C,U](m: Map[(A,B,C),U], a: A): Map[(B,C),U] = m.collect { case ((aa,b,c),v) if aa == a => (b,c) -> v }
    def curry[A,B,C,U](m: Map[(A,B,C),U], b: B)(implicit d: DummyImplicit): Map[(A,C),U] = m.collect { case ((a,bb,c),v) if bb == b => (a,c) -> v }
    

    【讨论】:

    • 第一个没有给你错误“Overloaded definition with defaults?”
    • @rausted 第一个在 Scala 3.0 中工作,又名 dotty
    猜你喜欢
    • 2012-08-29
    • 2021-07-04
    • 1970-01-01
    • 2020-11-08
    • 2020-10-25
    • 1970-01-01
    • 2010-09-25
    • 2019-07-12
    相关资源
    最近更新 更多