Подтвердить что ты не робот

Почему Scalaz использует сложные символы и не содержит внутрикодовой документации?

Я иногда смотрю на Scalaz и считаю это довольно трудным для начинающего программиста Scala.

  implicit def KleisliCategory[M[_]: Monad]: Category[({type λ[α, β]=Kleisli[M, α, β]})#λ] = new Category[({type λ[α, β]=Kleisli[M, α, β]})#λ] {
    def id[A] = ☆(_ η)
    def compose[X, Y, Z](f: Kleisli[M, Y, Z], g: Kleisli[M, X, Y]) = f <=< g
  }

  implicit def CokleisliCategory[M[_]: Comonad]: Category[({type λ[α, β]=Cokleisli[M, α, β]})#λ] = new Category[({type λ[α, β]=Cokleisli[M, α, β]})#λ] {
    def id[A] = ★(_ copure)
    def compose[X, Y, Z](f: Cokleisli[M, Y, Z], g: Cokleisli[M, X, Y]) = f =<= g 
  }

Методы Scalaz могут показаться очевидными для опытных функциональных программистов, но для кого-то еще трудно понять.

Почему в коде Scalaz так мало документации?

Почему они используют так много операторов, которые не читаются для большинства людей? Я даже не знаю, как набирать или без копирования/вставки. И это просто пример, потому что их много.

Некоторые говорят, что Scalaz был нечитаемым в начале, но через 2 года они находят это замечательным. Интересно, с чего начать с Scalaза. Валидация Scala кажется самой легкой частью, но после этого?

4b9b3361

Ответ 1

Я согласен с тем, что Scalaz в основном недокументирован. Проблема в том, что он собирает много продвинутых концепций из Haskell (и лежащей в их основе математики) и документируя их все подробно, станет писать целую книгу о функциональном программировании (и математике). Поэтому я считаю, что подход Scalaz:

  • Если вы знаете и нуждаетесь в какой-либо концепции из функционального программирования, подготовленного для Scala, вы, скорее всего, найдете его здесь.
  • Если вы этого не знаете, вам придется изучить его в другом месте.

Давайте посмотрим на ваш пример: если вы знаете категории Kleisli и как каждая монада порождает одну, определение само по себе -contained. Если вы этого не сделаете, значит, KleisliCategory не имеет для вас никакого смысла.

(По моему опыту, Haskell лучше изучает передовые концепции из функционального программирования. Хотя Scala намного лучше, чем Java, он по-прежнему перетаскивает Java OO/императивное наследие, которое немного мешает.)


Рассмотрение символов Юникода. Глядя на источники, кажется, что они используются только в качестве синтаксического сахара или, по крайней мере, у них есть не-Unicode-аналог:

def ☆[M[_], A, B](f: A => M[B]): Kleisli[M, A, B] = kleisli(f)
def η[F[_]](implicit p: Pure[F]): F[A] = pure
def cokleisli[W[_], A, B](f: W[A] => B): Cokleisli[W, A, B] = ★(f)

Таким образом, вы можете обойтись без них, если хотите.

Тем не менее, я не уверен, что если их в Scalaсе - хорошая идея. Это может сделать код невозможным для чтения для тех, кому не хватает правильных шрифтов. Я предпочел бы использовать чистые символы ASCII.

Ответ 2

Для начала нужно прочитать "Learn You a Haskell", который охватывает многие концепции.

Смотреть Крис Маршалл (@oxbow_lakes) говорит о скаразе: http://skillsmatter.com/expert/scala/chris-marshall

Получите копию функционального программирования в Scala из Manning, написанную некоторыми из авторов scalaz.

У меня есть несколько небольших примеров в моем блоге http://www.casualmiracles.com/blog/

Я бы сказал, что есть еще более простые места для начала с помощью скаляза, чем проверка, что представляет собой различные обогащения на Option, такие как ~ foo, который возвращает значение, содержащееся в опции, или "ноль" для типа опций (0 для чисел, пустая строка для String и т.д.).

Я забыл про очень подробную серию статей под названием Learning Scalaz на http://eed3si9n.com/

Ответ 3

Как и в любом проекте с открытым исходным кодом, единственный действительно истинный и приемлемый ответ на вопрос "Почему не их лучшая документация?" "Потому что никто еще не написал это. Вы можете добровольно".

(Честно говоря, я не знаю, приведет ли этот ответ к увеличению или понижению. Интересный эксперимент.)