首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scalaz镜头组合

Scalaz镜头组合
EN

Stack Overflow用户
提问于 2012-08-03 10:00:39
回答 2查看 1.1K关注 0票数 10

这里有一个非常简单的问题。看完一篇精彩的镜头介绍之后:

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

我想我可以尝试一下演讲中提到的一个简单的例子:

代码语言:javascript
复制
import scalaz.Lens._
fst.andThen(snd).set(((1,2),3),9)

然后是下面的错误

代码语言:javascript
复制
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))
                      ^

有没有关于如何让它工作的想法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-03 11:23:48

您将需要帮助编译器解决一些问题。以下任一操作都可以:

代码语言:javascript
复制
(fst andThen snd[Int, Int]).set(((1, 2), 3), 9)

或者:

代码语言:javascript
复制
(fst[(Int, Int), Int] andThen snd).set(((1, 2), 3), 9)

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

代码语言:javascript
复制
setL (sndLens . fstLens) 9 ((1, 2), 3)

您可以阅读answers here,了解有关Scala中类型推断限制的更多信息。

票数 9
EN

Stack Overflow用户

发布于 2012-08-03 16:56:35

不幸的是,在这种情况下,shapelesslenses的wrt类型推断并不是很好,

代码语言:javascript
复制
scala> import shapeless._ ; import Nat._
import shapeless._
import Nat._

scala> def fst[A, B] = Lens[(A, B)] >> _0
fst: [A, B]=> shapeless.Lens[(A, B),A]

scala> def snd[A, B] = Lens[(A, B)] >> _1
snd: [A, B]=> shapeless.Lens[(A, B),B]

scala> (snd compose fst).set(((1, 2), 3))(9)
<console>:16: error: polymorphic expression cannot be instantiated
  to expected type;
 found   : [A, B]shapeless.Lens[(A, B),A]
 required: shapeless.Lens[?,(?, ?)]
              (snd compose fst).set(((1, 2), 3))(9)

但是,如果我们散布一些类型注释,

代码语言:javascript
复制
scala> (snd compose fst[(Int, Int), Int]).set(((1, 2), 3))(9)
res0: ((Int, Int), Int) = ((1,9),3)

无论是在这里还是在scalaz.Lens中,问题的根源都是我们需要的镜头既是值(以便它们可以被组合)又是多态(以便我们可以在元组元素类型上进行抽象)。无形状和无标度镜头是值,但不是多态的(至少,不是有用的)。

无形者应该能做得更好。注意这个空间。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11788261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档