2015-05-17 8 views
8

W Scali klasy ogólne, takie jak Future, Option i List, wszystkie mają metody map i flatMap. Jak rozumiem, wszystkie one są podobne do Functors w Haskell.Dlaczego w Scali nie ma cechy "Funktora"?

Zastanawiam się, dlaczego nie jest to cecha (interfejs) nazywa funktora w Scala ..

Czy ktoś ma pomysły na ten temat?

+2

Bo Scala nie jest językiem badawczym? Haskell jest mniej ogólnym/praktycznym językiem niż Scala, można powiedzieć. – AJFarmar

+10

@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

+1

@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

Odpowiedz

11

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.

+1

"Nie wiem" - dobra odpowiedź! – ZhekaKozlov

+1

@ZhekaKozlov, Wierzę, że odpowiedziałem na oryginalne pytanie (dlaczego w stdlib nie ma funktora * cecha *) - po prostu nie jest to użyteczne i wygodne. "Nie wiem" trochę chodziło o klasy typów. –

+1

Jest to niezgodne z rzeczywistością. Scala's std lib ma kilka typów znaków: Numeric (== Haskell's Num), Integral (= = Integral), Fractional (== Fractional), Ordering (== Ord), Equiv (== Eq). – ZhekaKozlov

4

Myślę, że założenie jest takie, że każdy zainteresowany użyciem Functor/Applicative/Monad/etc. jest lepiej obsługiwany za pomocą Scalaz. Nie bycie w standardowej bibliotece oznacza, że ​​jest bardziej swobodnie ewoluować, nie jest związane z harmonogramem wydań Scala, itp. Just look at how long it took to make Monad extend Applicative in GHC!