我正在与Control.Lens
. 我正在编写的实际功能相当复杂,但出于这个问题的目的,我将其归结为一个最小的失败示例:
import Control.Lens
exampleFunc :: Lens s t a b -> String
exampleFunc _ = "Example"
这无法编译,产生以下错误消息:
Illegal polymorphic or qualified type: Lens s t a b
Perhaps you intended to use -XRankNTypes or -XRank2Types
In the type signature for `exampleFunc':
exampleFunc :: Lens s t a b -> String
为什么这是非法的?它似乎与以下内容非常相似,它确实可以编译:
import Data.Maybe
exampleFunc' :: Maybe (s, t, a, b) -> String
exampleFunc' _ = "Example"
所以我假设不同之处在于Lens
. 但是Lens
类型使exampleFunc
' 的类型非法呢?我有一个偷偷摸摸的怀疑它与Functor
定义中的限定有关Lens
,但我可能是错的。作为参考,定义为Lens
:
type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t
那么,我是否必须以某种方式满足Functor
我的定义中的资格exampleFunc
?如果是这样,怎么做?我没有看到在我的类型签名中我有机会声明这个约束。Functor
或者也许我走错了路,我的问题与约束无关。
我已经阅读了有关“非法多态等”错误消息的所有 Stack Overflow 问题。也许这是我对 Haskell 展示不熟悉,但我看不出任何这些问题适用于我目前的情况。
我也无法找到有关错误消息一般含义的任何文档。