(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) =>
meansa
は class のインスタンスでなければなりません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