Этот вопрос не предназначен как пламенная приманка! Как это могло бы быть очевидно, я недавно смотрел Scalaz. Я пытаюсь понять почему Мне нужна часть функциональности, которую предоставляет библиотека. Вот кое-что:Scalaz: запрос на использование для композиции Cokleisli
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 и передать в NEL[Int]
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 объяснить, как на самом деле работает эта мощная библиотека.
Спасибо за этот ответ - я принял * retronym's *, потому что он ответил на запрос в случае использования, но этот по-прежнему велик! –
Нет пота, я отредактировал ответ retronym, чтобы добавить пример композиции cokleisli. – Apocalisp
Я считаю, что вы можете «сопоставить» (f) ', чтобы получить' W [W [A]] => W [B] '", увы, у меня нет прав на редактирование. –