私はControl.Lens
で作業しています。私が書いている実際の機能はかなり複雑ですが、この質問の目的のために、私は、最小限の失敗例にそれを煮詰めてきました: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
のdefinitionは次のとおりです。
type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t
だから、私は何とかexampleFunc
の私の定義でFunctor
資格を満たさなければならないのですか?もしそうなら、どうですか?私は自分の型署名のどこにこの制約を宣言する機会があるのか分かりません。または、私は間違ったトラックにいるかもしれません。問題はFunctor
という制約とは関係ありません。
「違法ポリモーフィック」エラーメッセージに関するすべてのスタックオーバーフローに関する質問を読んだことがあります。おそらく、これはHaskellの見解に精通していないことですが、現在の状況に該当する質問は表示されません。
エラーメッセージの意味に関する一般的なドキュメントを見つけることはできませんでした。
「RankNTypes」は、コンパイラが示唆しているように安全にスイッチを入れることができる拡張機能の1つです。おそらく 'OverlappingInstances'と' IncoherentInstances'ではそうではありませんが、これは他の多くの拡張もOKです。 – leftaroundabout