这个问题不是诱饵!很明显,我最近一直在研究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将它们组合起来并传入一个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 值是最终 NEL 中 (String) 元素的字符数。我想到两件事:
- 我怎么能从所涉及的方法签名中知道我的 NEL 将以这种方式减少?(我根本没想到结果)
- 这有什么意义?可以为我提炼出一个相当简单且易于理解的用例吗?
这个问题是对像retronym这样可爱的人的一个隐晦的请求,以解释这个强大的库实际上是如何工作的。