Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在唱片中保留镜头_Haskell_Haskell Lens_Impredicativetypes - Fatal编程技术网

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的类型,这是不允许的。用多态类型实例化多态类型变量称为非指示多态性