Я пытаюсь избегать конструкций, как это:троичного Оператор похожий на:
val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result
Хорошо, в этом примере then
и else
ветви просты, но вы можете изображения сложные. я построил следующее:
object TernaryOp {
class Ternary[T](t: T) {
def is[R](bte: BranchThenElse[T,R]) = if (bte.branch(t)) bte.then(t) else bte.elze(t)
}
class Branch[T](branch: T => Boolean) {
def ?[R] (then: T => R) = new BranchThen(branch,then)
}
class BranchThen[T,R](val branch: T => Boolean, val then: T => R)
class Elze[T,R](elze: T => R) {
def :: (bt: BranchThen[T,R]) = new BranchThenElse(bt.branch,bt.then,elze)
}
class BranchThenElse[T,R](val branch: T => Boolean, val then: T => R, val elze: T => R)
implicit def any2Ternary[T](t: T) = new Ternary(t)
implicit def fct2Branch[T](branch: T => Boolean) = new Branch(branch)
implicit def fct2Elze[T,R](elze: T => R) = new Elze(elze)
}
Определено, что я могу заменить выше простой пример с:
this.getClass.getSimpleName is {s: String => s.endsWith("$")} ? {s: String => s.init} :: {s: String => s}
Но как я могу избавиться от s: String =>
? Я хочу что-то вроде этого:
this.getClass.getSimpleName is {_.endsWith("$")} ? {_.init} :: {identity}
Я думаю, что компилятору нужны дополнительные материалы для вывода типов.
Поскольку я не на самом деле есть это в моем ответе - Причина, по которой» у вас возникли проблемы в том, что вывод типа работает лучше всего слева направо, но вы привязываете свои жетоны вместе справа налево из-за приоритета оператора. Если вы сделаете все ваши слова слов (с тем же приоритетом) и измените способ группировки, вы получите требуемый вывод. (Т.е. у вас будут классы «HasIs», «IsWithCondition», «ConditionAndTrueCase», которые будут создавать части выражения слева направо.) –
Я бессознательно предполагал способ вывода типа слева направо, но придерживался приоритета оператора и ассоциативность имен методов, особенно начиная с '?' перед любым другим символом alphanum в качестве имени метода first char и ':' для левой ассоциативности. Поэтому я должен переосмыслить новые имена методов, чтобы получить вывод типа, действующий слева направо. благодаря! –