2014-09-21 3 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) 

Если я пишу в терминале: : т cToken : т 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

+1

Подсказка для будущего: обычно лучше спроектировать подпись, а затем реализовать. – leftaroundabout

+1

BTW: вы должны поместить их так: 'cToken :: Stream sm Char => Char -> ParsecT sum [Char]', если вы сделали импорт – Carsten

ответ

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] 

и этот новый тип может быть непосредственно вставлен в ваш исходный файл.

Смежные вопросы