我有一条记录"hello world"
,为此我用MyRecord
创建了镜头。
我想在该记录中有一个字段,它本身拥有一个镜头,但是像其他字段一样,也可以通过镜头访问。
这是我要实现的代码:
makeLenses
如果我写的是{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE RankNTypes #-}
module Check where
import Lens.Micro ( Lens' )
import Lens.Micro.TH ( makeLenses )
data MyRecord a =
MyRecord { _normalField :: Int
, _myField :: Lens' (String, String) a
}
makeLenses ''MyRecord
而不是myField
,那么代码可以很好地编译,但是这样就不会为它生成镜头。
对于给定的代码_myField
输出
ghc
有人可以简要解释一下这里发生了什么,是否有一个好的解决方案?
答案 0 :(得分:2)
我相信通常的解决方案是诸如ALens之类的1级类型。我不知道microlens
家庭是否提供类似的服务。
GHC manual解释了问题和解决方案。它开始于:
通常,GHC仅实例化单态类型的多态函数(一个没有forall的实例)。 [...] foo的定义被拒绝,因为必须使用
b := (forall s. ST s a) -> a
实例化id的类型,而这是不允许的。用多态类型实例化多态类型变量称为强制性多态性。