Я сталкиваюсь с рядом случаев использования, когда я заканчиваю попытки написать экземпляры Functor
, Applicative
, Monad
и т. д. в контекстах, где я также использую границы параметров типа.
Например...
import cats._
trait Preference[A] extends Order[A]
trait SocialWelfareFunction[-CC <: Iterable[P], +P <: Preference[_]]
extends (CC => P)
object SocialWelfareFunction {
def functor: Functor[({ type F[P <: Preference[_]] = SocialWelfareFunction[Iterable[P], P] })#F] = {
???
}
... когда я пытаюсь скомпилировать это, я получаю следующую ошибку.
kinds of the type arguments ([P <: Playground.this.Preference[_]]Playground.this.SocialWelfareFunction[Iterable[P],P]) do not conform to the expected kinds of the type parameters (type F) in trait Monad.
[P <: Playground.this.Preference[_]]Playground.this.SocialWelfareFunction[Iterable[P],P]'s type parameters do not match type F's expected parameters:
type P's bounds <: Playground.this.Preference[_] are stricter than type _'s declared bounds >: Nothing <: Any
Как я могу написать экземпляры Functor
, Applicative
, Monad
и т. д. для контекстов, в которых я также использую параметры типа? Это вообще возможно? Есть ли более подходящий путь вперед?
SocialWelfareFunction[C, ?]
должен бытьFunctor
во втором компоненте, то он должен иметьmap
, который принимаетf: A => B
и отображаетSocialWelfareFunction[C, A]
вSocialWelfareFunction[C, B]
. Можете ли вы представить себеmap
-реализацию, которая может отображатьPreference[_]
вList[Int]
илиJsonNode
или(Unit, Preference[_])
илиEither[String, Double]
? Если нет, то это не функтор. Тщательный выбор типовA
иB
не сильно поможет, потому что многие интересные конструкции функторов и монад полагаются на то, что функторF
может отображатьF[A]
, например.F[Either[X, A]]
. - person Andrey Tyukin   schedule 24.07.2018P <: Preference[A]
, а то, чтоP
имеет определенный экземпляр класса типовOrder[A]
. Возможно ли это? - person davidrpugh   schedule 24.07.2018Encoder[A]
вместоOrder[A]
, но чем-то похоже). На самом деле должна быть возможность аналогичным образом получить функтор для конструкторов типов, которые имеют ограничения на параметры. Я набросаю предложение (вероятно, это займет несколько минут). - person Andrey Tyukin   schedule 24.07.2018Functor
для конструкторов типов, которые имеют границы типов и зависят от классов типов, но я до сих пор не понимаю, чего вы хотели добиться с помощью этогоSocialWelfareFunction
. Кажется, вы хотели определить функторF[P] = (Iterable[P] => P)
, что невозможно (посколькуP
является одновременно входом и выходом, что делает его очень похожим наEndomorphisms[P]
, который также не является функтором, независимо от системы типов или языка). - person Andrey Tyukin   schedule 24.07.2018SocialWelfareFunction
просто не функтор. Возможно, я смогу найти лучший пример, чтобы продемонстрировать взаимодействие между границами параметров типа (или границами класса типа) при создании функторов, которые находятся в центре внимания этого вопроса. - person davidrpugh   schedule 24.07.2018