Сигнатура типа функции Parsec "parse" и класса "Stream"

Что означает ограничение (Stream s Identity t) означает в следующем объявлении типа?

parse :: (Stream s Identity t)
  => Parsec s () a -> SourceName -> s -> Either ParseError a

Что такое Stream в следующем объявлении класса, что это означает. Я полностью заблудился.

class Monad m => Stream s m t | s -> t where

Когда я использую Parsec, у меня все время возникают проблемы с сигнатурами типов ( xxx :: yyy ). Я всегда пропускаю подписи, загружаю src в ghci, а затем копирую подпись типа обратно в свой файл .hs. Это работает, но я до сих пор не понимаю, что это за сигнатуры.


EDIT: подробнее о сути моего вопроса.

Я все еще не понимаю «контекст» сигнатуры типа:

(Show a) =>

означает, что должен быть экземпляром класса Show .

(Stream s Identity t) => 

каков смысл этого «контекста», поскольку t никогда не отображался после = >


У меня есть много разных парсеров, поэтому я пишу функцию деформации, чтобы запускать любой из этих парсеров с реальными файлами. но здесь возникает проблема:

Вот мой код, он не может быть загружен, как мне заставить его работать?

module RunParse where
import System.IO
import Data.Functor.Identity (Identity)
import Text.Parsec.Prim (Parsec, parse, Stream)

--what should I write "runIOParse :: ..."
--runIOParse :: (Stream s Identity t, Show a) => Parsec s () a -> String -> IO ()
runIOParse pa filename =
  do
    inh <- openFile filename ReadMode
    outh <- openFile (filename ++ ".parseout") WriteMode
    instr <- hGetContents inh
    let result = show $ parse pa filename instr
    hPutStr outh result
    hClose inh
    hClose outh
10
задан Nybble 17 June 2011 в 02:38
поделиться