Я работаю с 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, но я не вижу ни одного из этих вопросов, применимых к моей текущей ситуации.
Я также не смог найти никакой документации о том, что означает сообщение об ошибке в целом.
RankNTypes
— это одно из расширений, которое вы можете безопасно включать, когда компилятор предлагает это сделать. Это нормально и для многих других расширений, хотя, возможно, не дляOverlappingInstances
иIncoherentInstances
. - person leftaroundabout   schedule 20.11.2013