我创建了两个基本上解析和输入的函数,我需要找到它们的类型签名,以便终端中的ghc -Wall不会给我一个警告。这是代码:
import Text.Parsec.Prim
import Text.Parsec.Char
import Text.Parsec.Error
import Text.Parsec.String
import Text.Parsec.Combinator
cToken c = try (many space >> char c >> many space)
sToken s = try (many space >> string s >> many space)
如果我在终端写道: :t cToken :t sToken
它回馈:
Prelude CurvySyntax> :t sToken
sToken
:: Text.Parsec.Prim.Stream s m Char =>
String -> Text.Parsec.Prim.ParsecT s u m [Char]
Prelude CurvySyntax> :t cToken
cToken
:: Text.Parsec.Prim.Stream s m Char =>
Char -> Text.Parsec.Prim.ParsecT s u m [Char]
如果我将这些类型放在我的代码中,那么就无法编译。 他们的类型是什么?
感谢。
答案 0 :(得分:2)
GHCi在导入方面略有欺骗:它允许您在任何时间点以全名引用公共模块。例如
$ ghci
$ [ ... ]
Prelude> :t Data.List.sortBy (Data.Ord.comparing snd)
Data.List.sortBy (Data.Ord.comparing snd)
:: Ord a => [(a1, a)] -> [(a1, a)]
正如您在此处所见,我能够通过其完全限定的模块+符号名称引用sortBy
和comparing
。如果您尝试在具体的Haskell源文件中执行相同操作,则除非我还导入这些模块(合格),否则它将失败。所以,GHCi需要一些自由。
同样,当你要求某个函数的类型时,它可能需要引用某些尚未导入的类型或类型类。 GHCi采用一些自由,只使用完全限定的模块+符号名称显示这些类型/类。在您的示例中,这些包括
Text.Parsec.Prim.Stream
Text.Parsec.Prim.ParsecT
如果您只是将这些文件复制到源文件,它会抱怨,因为您尚未导入模块Text.Parsec.Prim
。
那么分辨率是多少?只需导入它!
import Text.Parsec.Prim
如果您将其添加到源文件和:reload
GHCi,请再次检查类型,新结果将反映您可以访问这些类型的事实
Prelude CurvySyntax> :t sToken
sToken :: Stream s m Char => String -> ParsecT s u m [Char]
这个新类型可以直接粘贴到您的源文件中。