Я пытаюсь перенести общую библиотеку для Haskell в Scala. Тем не менее, я в настоящее время не очень доволен тем, как я решил функцию Generic Crush в Scala.Scala Несколько параметров типа, которые определены позже
Я определил следующие способы обработки функций Crush.
trait FRep[G[_],F[_]]{
def frep[A](g1 : G[A]) : G[F[A]]
}
trait Crush[B,A]{
def selCrush : Assoc => A => B => B
}
Далее, я хотел определить функцию раздавливания, но здесь я столкнулся с проблемами. Проблема в том, что мне нужна эта особенность FRep, чтобы представить функцию Crush, но G (Generic) в frep позволяет только 1 параметр. Я решил это, используя типы лямбда, но у меня все еще есть некоторые проблемы для определения функции. Это подход, который я хотел бы работать:
def crush[B,A,F[_]](asc : Assoc)(f : A => B => B)(z : B)(x : F[A])(implicit rep : FRep[({type AB[A] = Crush[B,A]})#AB,F]): B = {
def fCrush = new Crush[B,A]{
override def selCrush= _ => f
}
return(rep frep(fCrush).selCrush(asc)(x)(z))
}
Это, очевидно, дал ошибку, поскольку параметр в функции давке не то же самое, как типа А лямбда в неявной переменной повторении, которое должно быть таким же, чтобы использовать функцию Crush. Это ошибка, я получил:
<pastie>:677: error: type mismatch;
found : x.type (with underlying type F[A])
required: A
return(rep frep(fCrush).selCrush(asc)(x)(z))
Таким образом, решение, которое я придумал, чтобы разбить функцию раздавливания в более части, так что я мог бы использовать один и те же А для функции раздавливания. Это текущее решение, которое составляет:
class CrushFunction[B,F[_]](asc : Assoc)(z : B)(implicit rep : FRep[({type AB[A] = Crush[B,A]})#AB,F]){
def crush[A](f : A => B => B)(x : F[A]) : B = {
val crushVal = new Crush[B,A]{
override def selCrush: Assoc => A => B => B = _ => f
}
return(rep.frep(crushVal).selCrush(asc)(x)(z))
}
}
Итак, мой вопрос: Есть ли способ лучше решить эту проблему?
-Xlint для теневого типа param. Как бы вы разобрали «привет» + («мир»). Length'? Я думаю, они хотят добавить аннотацию, чтобы указать, какие участники (операторы) могут использоваться постоянно. Это поможет читаемости, но, возможно, правило Abide может предупредить об инсайде alnum, за которым не следует пробел (и т. Д.). –
Вы правы. Это работает! Спасибо за отличное объяснение! – maffh