Category: общество

Category was added automatically. Read all entries about "общество".

Игра Жизнь для разреженных матриц

Возник вопрос, как написать решение для случая, когда живых клеток намного меньше неживых. Тогда игровое поле логично представить в виде множества координат живых клеток -- Set[(Int, Int)]. Как бы вы решили эту задачу ? У меня пока есть только одна идея: для каждой из живых клеток сгенерить её соседей и дальше фильтровать выживших.

Scalaz для сельских механизаторов

Меня тут попросили выступить перед сельскими механизаторами программистами на джаве/скале с презентацией про scalaz. У аудитории (как и у меня) нет математического образования, а у большинства вообще нет никакого кроме армейских курсов. Идея презентации -- показать как абстракции из scalaz (а именно моноиды, функторы, монады, аппликативные функторы и стрелки Клейсли) помогают писать "хороший", с точки зрения הנדסת תוכנה, код.

Просьба покритиковать нижеследующую презентацию:

---

Итак, что значит "хороший" код ? Это в частности код который состоит из небольшого количества примитивов и правил для их композиции. Так, что эти примитивы можно "композировать" при помощи этих правил, чтобы построить всё, что нужно.

Композиция Функций

Вот например "чистая функция". Такие функции легко композировать с помощью compose. Скажем, функции ab: A => B и bc: B => C можно скомпозировать, чтобы получить ac: A => C = bc compose ab.

А что делать, если функции ab и boc "нечистые" ? Например определены не для всех аргументов. Как скомпозировать aob: A => Option[B] и boc: B => Option[C] ?

val aoc: A => Option[C] = a => aob(a) flatMap boc

(здесь нужен какой-нибудь практический пример)

А как написать compose, чтобы скомпозировать эти функции, опуская аргументы ?

def compose[A, B, C](aob: A => Option[B], aob: B => Option[C]): A => Option[C] = ...

Легко заметить, что это наша функция compose использует только flatMap метод Option'а. То есть нашу compose можно обобщить для любого M[_], у которого есть flatMap.

val amb: A => M[B] = ...
val bmc: A => M[C] = ...
val amc: A => M[C] = bmc compose amb

(такой способ композиции называется "бесточечным")

К сожалению этот пример не скомпилируется, но мы скоро увидим, как такую композицию можно написать на scalaz.

Стрелки Клейсли и Монады

Чтобы наш compose был совсем похож на настоящий compose для чистых функций нам нужно, чтобы он был ассоциативен.

(здесь нужен какой-нибудь практический пример)

А кроме того, нам нужно уметь превращать "чистую функцию" A => B в A => M[B], чтобы композировать её с B => M[C]

(здесь нужен какой-нибудь практический пример)

Из этих двух требований -- ассоциативности compose и превращения чистой функции A => B в A => M[B] -- следуют требования к flatMap, которые называются "монадными законами", а M[_] с flatMap, удовлетворяющей этим законам, называется "монадой".

Функции вида A => M[B] называются "стрелками Клейсли", и в scalaz для них есть специальная "обёрткa":

class Kleisli[M[_], A, B](run: A => M[B]) { def compose[C](other: Kleisli[M, B, C])(implicit M: Monad[M]): Kleisli[M, A, C] = ... }

Обратите внимание на использование implicit argument Monad[M]. Это трюк называется "тайпклассом", и вся scalaz на нём построена. Как видим, монада и прочие вышеперечисленные абстракции (моноид, функтор и проч.) имплементированы в scalaz как тайпклассы. Наверное, можно сказать, что scalaz по сути и есть набор тайпклассов.

(вероятно тут нужно рассказать об тайпклассах поподробнее)

И вот теперь мы сможем, наконец, скомпозировать aob: A => Option[B] и boc: B => Option[C] при помощи Kleisli[Option, A, B]

val aob: Kleisli[Option, A, B] = Kleisli {a => ... // Option[B] } // A => Option[B]
val boc: Kleisli[Option, B, C] = Kleisli {b => ... // Option[C] } // B => Option[C]
val aoc = boc compose aob // Kleisli[Option, A, C]

Продолжение следует

Тут, наверное, возникает закономерный вопрос, a на хера козе баян неужели scalaz нужна только для "бесточечной" записи.
Попробуем ответить на него в следующей части.

Тестовые задачи на Scala

Доброго времени суток, ув. сообщество. Наверняка, подавляющее большинство людей здесь присутствующих использует Scala у себя на работе. Хотелось бы получить задачи, которые обычно предоставляются соискателям для проверки их навыков.

Бонус:

Возможно кто-то участвует в разработке чего-нибудь опенсорсного и не слишком сложного. Мне было бы присоединиться к такому проекту, помогать развивать его, а в замен получать навыки разработки на Scala и ФП.
research
  • sorhed

Как вы оцениваете сложность Scala?

Решился применить скалу в одном коммерческом проекте. Пишу domain model и замечаю, что мозги-то поскрипывают. Вариантные типы, кейс-классы, и прочий матан даром не даётся, хотя вроде бы не первый раз замужем и на джаве уже пишу хрен знает сколько лет.

В связи с чем у меня к вам вопрос: как вы оцениваете сложность применения скалы в реальных проектах? Например:

1) Скала? В реальных проектах? Вы бы ещё на хаскеле писали;
2) Первые полгода тяжело, а потом привыкаешь;
3) Я вообще-то раньше на хаскеле писал, а на скале заставили; фигня это для начинающих программистов.

И связанный с ним второй вопрос: а другие участники проекта на скале вместе с вами могут писать? Варианты ответа вроде:

1) Говно вопрос!
2) Ну, пришлось объяснить им что к чему, но разобрались и сейчас пишут;
3) Нет, это для гениев, а гении не все;
4) Скала? В реальных проектах? См. вопрос 1.

В общем, что скажете?