GHC.Prim.Any создан вместо свободной переменной [в полиморфной функции] - PullRequest
3 голосов
/ 31 января 2012

Это ошибка?

{-# LANGUAGE NoMonomorphismRestriction #-}
import qualified Text.Parsec.Token as P
import Text.Parsec.Language (haskellDef)
(P.TokenParser { P.identifier = ident }) = P.makeTokenParser haskellDef

дает ident типа Text.Parsec.Prim.ParsecT String GHC.Prim.Any Data.Functor.Identity.Identity String, тогда как определение

haskell = P.makeTokenParser haskellDef
ident = P.identifier haskell

дает один из типов Text.Parsec.Prim.ParsecT String u Data.Functor.Identity.Identity String

1012 * редактировать * В ghci поведение не идентично, infixl 4 <++> (<++>) = liftM2 (++) (P.TokenParser { P.identifier = ident }) = P.makeTokenParser haskellDef suitable_macro = ident parseMacro = many space *> suitable_macro parseMacro' = try (string "{{" *> parseMacro <* string "}}") parseAll = many (noneOf "{") <++> option "" (parseMacro' <|> (string "{" <++> parseAll)) Затем попробуйте запустить его, *Hz2.Preproc> parseTest parseAll "asdf{{b}}" <interactive>:0:11: Couldn't match expected type `()' with actual type `GHC.Prim.Any' Expected type: Parsec String () a0 Actual type: ParsecT String GHC.Prim.Any Data.Functor.Identity.Identity [Char] In the first argument of `parseTest', namely `parseAll' In the expression: parseTest parseAll "asdf{{b}}"

1 Ответ

6 голосов
/ 31 января 2012

Не совсем;Я полагаю, что это поведение, совместимое с отчетами: переменные полностью полиморфного типа в шаблонах создаются в Any.Тем не менее, в GHC 7.2 и более поздних версиях работает так, как вы ожидаете (особенно обратите внимание на сообщение фиксации в конце).

Что касается поведения GHCi, то это потому, что GHCi расширенные правила по умолчанию по умолчанию полностью полиморфные переменные до ().

...