2014-09-21 73 views
2

我创建了两个基本解析和输入的函数,我需要找到它们的类型签名,以便终端中的ghc-Wall不会给我一个警告。这是代码:在Haskell中查找函数的类型签名

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] 

如果我把这些类型在我的代码那么它不能编译。 它们的类型是什么?

谢谢。

+3

如果将这些代码放入代码中,会出现什么错误? – Carsten 2014-09-21 13:15:41

+1

提示未来:先设计签名,然后再实现,通常效率更高。 – leftaroundabout 2014-09-21 13:17:30

+1

顺便说一句,你应该把这些放在这样的:'cToken :: Stream sm Char => Char - > ParsecT sum [Char]'如果你做了进口 – Carsten 2014-09-21 13:17:42

回答

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] 

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