Я хотел бы моделировать Mapper
, который принимает в контейнере A
с (T[A]
), так что с функцией f: A => B
мы получаем другой контейнер T[B]
. У меня, после многих часов экспериментов (см комментировал код) придумали следующее решение:Scala несоответствие типов высшего kinded типа
sealed trait Mapper[ A, T[ A ], B ] {
//type Out <: T[B]
type Out[X] //= T[X]
def map(l: T[ A ], f: A => B): Out[B]
}
object Mappers {
implicit def typedMapper[ A, T[ A ] <: Iterable[ A ], B ]: Mapper[ A, T, B ] =
new Mapper[ A, T, B ] {
override type Out[X] = Iterable[X]
//override type Out <: Iterable[ B ]
//def map(l: T[ A ], f: A => B) : this.Out = {
def map(l: T[ A ], f: A => B) : Out[B] = {
println("map")
l.map(f)
}
}
implicit def IntMapper = typedMapper[Int, List, Int]
}
//def testMapper[ A, T[ A ], B ](l: T[ A ], f: A => B)(implicit mapper: Mapper[ A, T, B ]): T[B] = {
def testMapper[ A, T[ A ], B ](l: T[ A ], f: A => B)(implicit mapper: Mapper[ A, T, B ]) : Mapper[A, T, B]#Out[B]= {
println(mapper)
mapper.map(l, f)
}
теперь я могу использовать его следующим образом:
import Mappers.IntMapper
val l9 = testMapper(List(1, 2, 3), { x: Int => x + 1 })
println(l9)
Хотя это работает я до сих пор потеря как я могу напрямую ограничить Out до T[B]
. Если я это сделаю, я всегда получаю несоответствие типа. Может ли кто-нибудь указать более простой/простой способ сделать это без псевдонима типа или напрямую с помощью T[B]
?
ТИА
Ваш код в соответствии с опубликованным не компилируется, можете ли вы опубликовать версию, которая делает? –
Вы предоставляете конкретную реализацию так называемого «Functor» в теории категорий. Существует широко используемая библиотека под названием «scalaz», а также «cat». Для хорошего резюме, посмотрите http://blog.tmorris.net/posts/functors-and-things-using-scala/index.html –
'Mapper' не' Functor': вы можете ограничить возможный 'A' s и 'B', а 'Functor' должен работать для всех' A' и 'B'. Это делает это намного менее полезным в некоторых случаях, но я предполагаю, что для этого должно быть какое-то использование. – HTNW