Я работаю с 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
.
Я прочитал все вопросы о переполнении стека, которые я смог найти относительно сообщения об ошибке "незаконный полиморфный и т.д.". Возможно, это мое отсутствие знакомства с показом Haskell, но я не вижу ни одного из этих вопросов, применимых к моей нынешней ситуации.
Я также не смог найти документацию о том, что означает сообщение об ошибке вообще.