Что означает ограничение (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.Это работает, но я до сих пор не понимаю, что все эти подписи.
РЕДАКТИРОВАТЬ: подробнее о сути моего вопроса.
Явсе еще запутался в «контексте» подписи типа:
(Show a) =>
означает, что a
должен быть экземпляром класса Show
.
(Stream s Identity t) =>
в чем смысл этого 'context ', так как 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