Как выглядит такая черта? Помните, что функтор определяется функцией fmap
, которая поднимает регулярную функцию на функцию, действующую на «функториальные» значения (или, альтернативно, применяет регулярную функцию к содержимому функтора). Самое близкое, что я могу представить, это
trait Functor[T] {
type Self[U] <: Functor[U]
def fmap[U](f: T => U): Self[U]
}
Такое определение не очень полезно и относительно сложно. Черты не имеют необходимой гибкости для абстрагирования более высоких понятий, таких как функторы.
Однако Scala имеет классы типов, то есть, можно использовать черты и неявные параметры умным способом реализовать шаблон класса типа:
trait Functor[F[_]] {
def fmap[T, U](f: T => U)(v: F[T]): F[U]
}
implicit object OptionFunctor extends Functor[Option] {
def fmap[T, U](f: T => U)(v: Option[T]): Option[U] = v match {
case Some(r) => Some(f(r))
case None => None
}
}
def doSomething[F[_]: Functor](f1: F[Int], f2: F[String]): F[Long] = ??? // whatever
// equivalent to:
// doSomething :: Functor f => f Int -> f String -> f Long
// in Haskell
И это именно то, что scalaz обеспечивает.
Что касается того, почему этого нет в стандартной библиотеке - я не знаю. Возможно, шаблон типа типа не был обнаружен сразу, и библиотека уже была сформирована в этот момент. Возможно, это только потому, что это несколько продвинутые концепции, которые на самом деле не принадлежат к стандартной библиотеке. Может быть, что-то еще.
Поскольку Scala не является языком исследований? Haskell - это менее общий/практический язык, чем Scala, можно сказать. – AJFarmar
@ AJFarmar, так как «Functor» имеет огромное практическое значение, я не уверен, как это на него отвечает. Это лучше объясняет, почему у него нет, скажем, «категории». – dfeuer
@dfeuer Но само слово происходит от теории категорий, которую я не ожидал бы появиться в Scala или каком-либо другом основном языке. Может быть, это под другим именем? – AJFarmar