我正在使用 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
的类型不合法呢?我有一种隐隐的感觉,这与 Lens
定义中的 Functor
限定有关,但我可能错了。参考此处 Lens
的定义:
type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t
那么,我需要在exampleFunc
的定义中以某种方式满足Functor
限制吗?如果是这样,怎么做呢?我没有看到在我的类型签名中声明此约束的机会。或者我可能走错了路,我的问题与Functor
限制无关。
我已阅读了所有我能找到有关“非法多态等”错误消息的Stack Overflow问题。也许这是因为我不熟悉Haskell,但我看不出这些问题中任何一个适用于我的当前情况。
我也没有找到任何关于该错误消息在一般情况下表示什么的文档。
RankNTypes
是编译器建议开启的扩展之一。对于许多其他扩展来说也是可以的,但对于OverlappingInstances
和IncoherentInstances
可能不太适用。 - leftaroundabout