ghc-7.10:非类型变量参数(使用FlexibleContexts允许此操作)

时间:2015-02-02 21:43:51

标签: haskell ghc parsec

我试图使用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

注意:我没有询问这个特定的库(hxt- *),因为我在其他地方也观察过这个。

3 个答案:

答案 0 :(得分:19)

This was a change introduced in GHC 7.10.1-rc1

  

GHC现在检查是否明确启用了推断类型签名所需的所有语言扩展。这意味着如果您的程序中推断出的任何类型签名需要一些语言扩展,您将需要启用它。动机是添加由GHC推断的缺失类型签名应该产生一个类似的程序。以前情况并非如此。

     

这是一个重大改变。过去用于编译的代码可能会失败,并显示需要特定语言扩展的错误消息(很可能是-XTypeFamilies-XGADTs-XFlexibleContexts

答案 1 :(得分:1)

我的代码遇到了同样的问题,其中一部分使用了Parsec,另一部分则没有。大多数都指向where块中没有签名的函数。

对我有用的解决方案是为函数添加显式签名,您可以在其中使用从错误中获得的推断类型,而不是保持ParsecT s u m [Char]类型的通用,I提供我想要的具体类型,例如Parsec String () [Char]

答案 2 :(得分:0)

我按照here所述设置了准系统Snap应用程序后出现此错误。

"" ++ """Haskell" !! 2之类的字符串操作被破坏了。当从GHCI获取Haskell文件时,我得到了这个错误的变体:

  

没有(Data.String.IsString [a0])的实例         文字"my string"' The type variable a0&#39;很暧昧       相关绑定包括myString :: [a0](绑定在myFile.hs:11:1)       注意:有一个潜在的实例可用:         instance Data.String.IsString [Char] - 在Data.String' In the expression: "my string" In an equation for变量中定义&#39;:variable =&#34; my string&#34;

<强>解决方案:

解决此问题的方法是从项目中的:set -XOverloadedStrings文件中删除行.ghci并重新启动GHCI。