记录镜头

时间:2019-01-24 21:26:10

标签: haskell lens impredicativetypes

我有一条记录"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

有人可以简要解释一下这里发生了什么,是否有一个好的解决方案?

1 个答案:

答案 0 :(得分:2)

我相信通常的解决方案是诸如ALens之类的1级类型。我不知道microlens家庭是否提供类似的服务。

GHC manual解释了问题和解决方案。它开始于:

  

通常,GHC仅实例化单态类型的多态函数(一个没有forall的实例)。 [...] foo的定义被拒绝,因为必须使用b := (forall s. ST s a) -> a实例化id的类型,而这是不允许的。用多态类型实例化多态类型变量称为强制性多态性。

相关问题