这里有一个非常简单的问题。看完一篇精彩的镜头介绍之后:
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))
^有没有关于如何让它工作的想法?
发布于 2012-08-03 11:23:48
您将需要帮助编译器解决一些问题。以下任一操作都可以:
(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)您可以阅读answers here,了解有关Scala中类型推断限制的更多信息。
发布于 2012-08-03 16:56:35
不幸的是,在这种情况下,shapeless的lenses的wrt类型推断并不是很好,
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)但是,如果我们散布一些类型注释,
scala> (snd compose fst[(Int, Int), Int]).set(((1, 2), 3))(9)
res0: ((Int, Int), Int) = ((1,9),3)无论是在这里还是在scalaz.Lens中,问题的根源都是我们需要的镜头既是值(以便它们可以被组合)又是多态(以便我们可以在元组元素类型上进行抽象)。无形状和无标度镜头是值,但不是多态的(至少,不是有用的)。
无形者应该能做得更好。注意这个空间。
https://stackoverflow.com/questions/11788261
复制相似问题