Scalaz 透镜组成

标签 scala scalaz lenses

这是一个非常简单的问题。观看精彩的镜头介绍后:

http://www.youtube.com/watch?v=efv0SQNde5Q

我想我可以尝试演讲中介绍的简单示例之一:

import scalaz.Lens._
fst.andThen(snd).set(((1,2),3),9)

随后出现此错误

error: type mismatch;
 found   : scalaz.Lens[(Nothing, Nothing),Nothing]
 required: scalaz.Lens[(Nothing, Nothing),C]
Note: Nothing <: C, but class Lens is invariant in type B.
You may wish to define B as +B instead. (SLS 4.5)
              fst.andThen(snd).set(((1,2),3))
                      ^

关于如何实现这项工作有什么想法吗?

最佳答案

您将需要为编译器提供一些帮助。以下任一操作均可:

(fst andThen snd[Int, Int]).set(((1, 2), 3), 9)

或者:

(fst[(Int, Int), Int] andThen snd).set(((1, 2), 3), 9)

我的猜测是,Edward Kmett 在演讲中掩盖了这个问题,因为它与他的主题并不真正相关——这只是 Scala 类型推断系统的(烦人的)怪癖之一。例如,在 Haskell 中,以下内容就可以了:

setL (sndLens . fstLens) 9 ((1, 2), 3)

您可以阅读答案here有关 Scala 中类型推断的限制的更多信息。

关于Scalaz 透镜组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11788261/

相关文章:

验证与析取

json - Argonaut,自定义 JSON 格式映射

list - 如果列表的元素符合某些条件,则更改列表元素,如果不符合,则使用 Data.Lens 添加新元素

scala - 编写隐式推导 "Laws"

scala - 如何使用正则表达式在 sc.textFile 中包含/排除某些输入文件?

scala - 为什么这个 Scalaz 7 枚举器会泄漏内存?

haskell - 如何使用镜头在 map 中查找值、增加值或将其设置为默认值

scala - 关于柯里化(Currying)函数的问题

java - Maven:在一个项目中混合使用 Java 和 Scala

Haskell - 在 newtype 上的 iso