Haskell 在唱片中保留镜头
我有一个记录Haskell 在唱片中保留镜头,haskell,haskell-lens,impredicativetypes,Haskell,Haskell Lens,Impredicativetypes,我有一个记录MyRecord,我用makelents为其创建镜头。 我想在记录中有一个字段,它本身有一个镜头,但也可以像其他字段一样使用镜头访问 这是我实现这一目标的代码: {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE RankNTypes #-} module Check where import Lens.Micro ( Lens' ) import Lens.Micro.TH ( makeLenses ) data MyRecord a
MyRecord
,我用makelents
为其创建镜头。
我想在记录中有一个字段,它本身有一个镜头,但也可以像其他字段一样使用镜头访问
这是我实现这一目标的代码:
{-# 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
而不是\u myField
,那么代码编译得很好,但是这样就不会为它生成镜头
对于给定的代码ghc
输出
/home/fabian/src/code-editor/app/Check.hs:11:1: error:
• Illegal polymorphic type: Lens' (String, String) a2
GHC doesn't yet support impredicative polymorphism
• In the type signature:
myField :: forall a_a5c6 a_a8tU.
Lens.Micro.Type.Lens (MyRecord a_a5c6) (MyRecord a_a8tU) (Lens' (String,
String) a_a5c6) (Lens' (String,
String) a_a8tU)
|
11 | makeLenses ''MyRecord
有人能简单地解释一下这里发生了什么,以及是否有一个很好的解决方案吗?我相信通常的解决方案是排名第一的类型,比如。我不知道microlens系列是否提供了类似的功能 本文解释了问题和解决方案。它开始于: 一般来说,GHC只会实例化单态类型(没有孔的类型)的多态函数。[…]foo的定义被拒绝,因为必须用
b:=(对于所有s.ST s a)->a来实例化id的类型,这是不允许的。用多态类型实例化多态类型变量称为非指示多态性