2015-05-17 2 views
8

В Scala общие классы, такие как Future, Option и List все имеют методы map и flatMap. Насколько я понимаю, все они похожи на Functors в Haskell.Почему в Scala нет черты «Functor»?

мне было просто интересно, почему это не признак (интерфейс) под названием Functor в Scala ..

Кто-нибудь есть идеи по этому поводу?

+2

Поскольку Scala не является языком исследований? Haskell - это менее общий/практический язык, чем Scala, можно сказать. – AJFarmar

+10

@ AJFarmar, так как «Functor» имеет огромное практическое значение, я не уверен, как это на него отвечает. Это лучше объясняет, почему у него нет, скажем, «категории». – dfeuer

+1

@dfeuer Но само слово происходит от теории категорий, которую я не ожидал бы появиться в Scala или каком-либо другом основном языке. Может быть, это под другим именем? – AJFarmar

ответ

11

Как выглядит такая черта? Помните, что функтор определяется функцией 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 обеспечивает.

Что касается того, почему этого нет в стандартной библиотеке - я не знаю. Возможно, шаблон типа типа не был обнаружен сразу, и библиотека уже была сформирована в этот момент. Возможно, это только потому, что это несколько продвинутые концепции, которые на самом деле не принадлежат к стандартной библиотеке. Может быть, что-то еще.

+1

«Не знаю» - хороший ответ! – ZhekaKozlov

+1

@ZhekaKozlov, я верю, что я ответил на исходный вопрос (почему в stdlib нет функции-функтора *) - это просто не так полезно и удобно. «Я не знаю», это было о типах классов. –

+1

Это фактически неверно. У std lib у Scala есть несколько типов: Numeric (== Haskell's Num), Integral (== Integral), Fractional (== Fractional), Ordering (== Ord), Equiv (== Eq). – ZhekaKozlov

4

Я думаю, что предположение заключается в том, что любой, кто заинтересован в использовании Functor/Applicative/Monad/etc. лучше использовать с помощью Scalaz. Не будучи в стандартной библиотеке означает, что более свободно развиваться, не привязано к расписанию выпуска Scala и т. Д. Just look at how long it took to make Monad extend Applicative in GHC!

Смежные вопросы