ghc-7.10: не аргумент переменной типа (используйте FlexibleContexts, чтобы разрешить это)
Я пытался использовать ghc-7.10 (RC 2) и получил это сообщение в ряде случаев, например,
src/Text/Regex/XMLSchema/Generic/RegexParser.hs:439:5:
Non type-variable argument
in the constraint: Text.Parsec.Prim.Stream s m Char
(Use FlexibleContexts to permit this)
When checking that ‘prop’ has the inferred type
prop :: forall s u (m :: * -> *) (t :: * -> *).
(Foldable t, Text.Parsec.Prim.Stream s m Char) =>
Char -> t Char -> Text.Parsec.Prim.ParsecT s u m [Char]
In an equation for ‘isCategory'’:
isCategory'
= (foldr1 (<|>) . map (uncurry prop)
$ [('L', "ultmo"), ('M', "nce"), ('N', "dlo"), ....])
<?> "illegal Unicode character property"
where
prop c1 cs2
= do { _ <- char c1;
.... }
Failed to install hxt-regex-xmlschema-9.2.0
Это должно быть что-то, что вводится новым ghc, или новой базой, которая поставляется с ним, или новым parsec (3.1.8), так как он работал раньше.
исходный код:
isCategory' :: Parser String
isCategory'
= ( foldr1 (<|>) . map (uncurry prop) $
[ ('L', "ultmo")
, ('M', "nce")
, ('N', "dlo")
, ('P', "cdseifo")
, ('Z', "slp")
, ('S', "mcko")
, ('C', "cfon")
]
) <?> "illegal Unicode character property"
where
prop c1 cs2
= do
_ <- char c1
s2 <- option ""
( do
c2 <- satisfy (`elem` cs2)
return [c2] )
return $ c1:s2
примечание: Я не спрашиваю об этом конкретном libray (hxt -*), так как я наблюдал это и в других местах.
3 ответов
это изменение было внесено в GHC 7.10.1-rc1:
GHC теперь проверяет, что все расширения языка, необходимые для сигнатур выводимого типа, явно включены. Это означает, что если какая-либо из сигнатур типа, выведенных в вашей программе, требует расширения языка, вам нужно будет включить его. Мотивация заключается в том, что добавление отсутствующей подписи типа, выведенной GHC, должно дать программу, которая typechecks. Ранее это не было случай.
это критическое изменение. Код, который использовался для компиляции в прошлом, может завершиться ошибкой с сообщением об ошибке, требующим определенного расширения языка (скорее всего
-XTypeFamilies
,-XGADTs
или-XFlexibleContexts
).
у меня такая же проблема с моим кодом, часть которого использует Parsec, а часть-нет. Большинство из них указывают на функции без сигнатур в A where
заблокировать.
решение, которое работает для меня, заключается в добавлении явных сигнатур для функций, где вы можете использовать выводимый тип, который вы получаете от ошибки по большей части, но вместо сохранения типов, таких как ParsecT s u m [Char]
generic, я поставляю конкретного типа Я хочу, например,Parsec String () [Char]
.
я получил эту ошибку после настройки приложения Barebone Snap, как описано здесь.
строковые операции, такие как "" ++ ""
или "Haskell" !! 2
были нарушены. При поиске файла Haskell из GHCI я получил вариант этой ошибки:
нет экземпляра для (Data.Строка.Функция isstring [А0]) возникает из буквального
"my string"' The type variable
А0' неоднозначно Соответствующие привязки включают myString:: [a0] (связанный в myFile.hs: 11: 1) Примечание: существует возможность экземпляр доступен: данные экземпляра.Строка.IsString [Char] -- определено вData.String' In the expression: "my string" In an equation for
variable': variable = "моя строка"
устранение:
способ исправить это, чтобы удалить строку :set -XOverloadedStrings
С .ghci
файл в моем проекте и перезапустите GHCI.