在Haskell中查找函数的类型签名

时间:2014-09-21 12:20:27

标签: haskell

我创建了两个基本上解析和输入的函数,我需要找到它们的类型签名,以便终端中的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]

如果我将这些类型放在我的代码中,那么就无法编译。 他们的类型是什么?

感谢。

1 个答案:

答案 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)]

正如您在此处所见,我能够通过其完全限定的模块+符号名称引用sortBycomparing。如果您尝试在具体的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]

这个新类型可以直接粘贴到您的源文件中。