Этот вопрос не означает пламенную приманку! Как можно было бы заметить, я недавно смотрел Scalaz. Я пытаюсь понять, почему мне нужны некоторые функции, которые предоставляет библиотека. Здесь что-то:
import scalaz._
import Scalaz._
type NEL[A] = NonEmptyList[A]
val NEL = NonEmptyList
Я поместил несколько выражений println в свои функции, чтобы увидеть, что происходит (в сторону: что я сделал бы, если бы пытался избежать побочных эффектов?). Мои функции:
val f: NEL[Int] => String = (l: NEL[Int]) => {println("f: " + l); l.toString |+| "X" }
val g: NEL[String] => BigInt = (l: NEL[String]) => {println("g: " + l); BigInt(l.map(_.length).sum) }
Затем я объединяю их с помощью cokleisli и передаю
val k = cokleisli(f) =>= cokleisli(g)
println("RES: " + k( NEL(1, 2, 3) ))
Что это печатает?
f: NonEmptyList(1, 2, 3)
f: NonEmptyList(2, 3)
f: NonEmptyList(3)
g: NonEmptyList(NonEmptyList(1, 2, 3)X, NonEmptyList(2, 3)X, NonEmptyList(3)X)
RES: 57
Значение RES - это количество символов элементов (String) в конечном NEL. Мне приходят две вещи:
- Как я мог знать, что мой NEL будет уменьшен таким образом от связанных подписей метода? (Я не ожидал результата вообще)
- В чем смысл этого? Может ли для меня дистиллировать достаточно простой и простой в использовании вариант использования?
Этот вопрос является тонко завуалированным призывом к прекрасному человеку, вроде retronym, чтобы объяснить, как эта мощная библиотека действительно работает.