Jak wyglądałaby taka cecha? Pamiętaj, że funktor jest określony funkcją fmap
, która podnosi regularną funkcję do funkcji działającej na wartości "funktorialne" (lub alternatywnie stosuje regularną funkcję do zawartości funktora). Najbliższe, jakie mogę sobie wyobrazić, to:
Taka definicja nie jest zbyt użyteczna i stosunkowo skomplikowana. Cechy nie mają niezbędnej elastyczności do abstrakcyjnego upiększania pojęć takich jak funktory.
Jednak Scala ma zajęcia typu, to znaczy, że możliwe jest wykorzystanie cech i parametrów ukrytych w sprytny sposób zaimplementować wzorzec klasy Type:
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
I to jest właśnie to, co scalaz zapewnia.
Jeśli chodzi o przyczyny nieobecności w standardowej bibliotece - nie wiem. Może wzór klasy typu nie został natychmiast odkryty, a biblioteka została już utworzona w tym momencie. Może dlatego, że są to dość zaawansowane koncepcje, które tak naprawdę nie należą do standardowej biblioteki. Może coś jeszcze.
Bo Scala nie jest językiem badawczym? Haskell jest mniej ogólnym/praktycznym językiem niż Scala, można powiedzieć. – AJFarmar
@AJFarmar, ponieważ 'Funktor' ma ogromną wartość praktyczną, nie jestem pewien, jak to odpowiada. To lepiej tłumaczyłoby, dlaczego nie ma, powiedzmy, cechy "Kategorii". – dfeuer
@dfeuer Ale samo słowo pochodzi od teorii kategorii, której nie spodziewałbym się pojawić w Scali ani w żadnym innym języku głównego nurtu. Może jest pod inną nazwą? – AJFarmar