Что означает ограничение (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) =>
означает a
должен быть экземпляр класса Show
.
(Stream s Identity t) =>
что означает этот "контекст", поскольку t
никогда не показывался после =>
У меня есть много разных парсеров для запуска, поэтому я пишу функцию warp для запуска любого из этих парсеров с реальными файлами. но здесь возникает проблема:
Вот мой код, Он не может быть загружен, как я могу заставить его работать?
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