这个问题并不是为了挑衅!正如你可能已经注意到的那样,我最近一直在研究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会从涉及的方法签名中以这种方式减少呢?(我根本没想到结果会是这样)
- 这有什么意义?可以为我概括一个相当简单易懂的用例吗?
map(f)
来得到W[W[A]] => W[B]
”,但很遗憾我没有编辑权限。 - Elazar Leibovich