¿Qué significa la restricción (Stream s Identity t)
en el siguiente tipo de declaración?La firma tipo de la función Parsec 'parse' y la clase 'Stream'
parse :: (Stream s Identity t)
=> Parsec s() a -> SourceName -> s -> Either ParseError a
¿Qué es Stream
en la siguiente declaración de clase, qué significa? Estoy totalmente perdido.
class Monad m => Stream s m t | s -> t where
Cuando uso Parsec, me meto en un atasco con el tipo de firmas (xxx :: yyy
) todo el tiempo. Siempre omito las firmas, cargo el src en ghci y luego copio la firma de tipo a mi archivo .hs. Funciona, pero todavía no entiendo cuáles son todas estas firmas.
EDIT: más sobre el punto de mi pregunta.
Todavía estoy confundido sobre el 'contexto' del tipo de firma:
(Show a) =>
significa a
debe haber una instancia de la clase Show
.
(Stream s Identity t) =>
¿cuál es el significado de este 'contexto', ya que t
nunca se presentó después de la =>
Tengo un montón de diferentes analizador para funcionar, así que escribir una función de urdimbre para ejecutar cualquiera de esos analizadores con archivos reales. pero aquí viene el problema:
Aquí está mi código, no se puede cargar, ¿cómo puedo hacer que funcione?
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
¿Está declarando tipos para sus combinadores? Si no, ¿tal vez tienes errores de ambigüedad? –