Преодоление тематического исследования стирания; Карри Карри - PullRequest
0 голосов
/ 17 февраля 2020

Я боролся со следующим 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 }

Я не могу скомпилировать это, поскольку обе функции одинаковы после Erasure, и мне приходится прибегать к ужасным обходным путям (например, curry1, curry2, curry12 et c.)

Ошибка: двойное определение: def curry [A, B, C, U] (m: карта [(A, B, C), U], a: A): Карта [(B, C), U] в строке 152 и определение карри [A, B, C, U] (м: Карта [(A, B, C), U], b: B): Карта [(A, C), U] в строке 153 имеет тот же тип после стирания: (m: scala .collection.immutable.Map, a : Объект) scala .collection.immutable.Map def curry [A, B, C, U] (m: карта [(A, B, C), U], b: B): карта [ (A, C), U] = m.collect {case ((a, bb, c), v) если bb == b => (a, c) -> v}

Есть ли способ заставить эту работу? Страшные ситуации допускают ужасные решения (возможно, отражение и TypeTags?)

1 Ответ

2 голосов
/ 17 февраля 2020

Обходной путь:

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 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...