在下面的類型聲明中約束(Stream s Identity t)
是什麼意思?Parsec函數'parse'和類'Stream'的類型簽名
parse :: (Stream s Identity t)
=> Parsec s() a -> SourceName -> s -> Either ParseError a
什麼是Stream
在下面的類聲明中是什麼意思。我完全迷失了。
class Monad m => Stream s m t | s -> t where
當我使用秒差距,我得到與類型簽名(xxx :: yyy
)所有的時間卡紙。我總是跳過簽名,將src加載到ghci中,然後將類型簽名複製回我的.hs文件。它有效,但我仍不明白這些簽名是什麼。
編輯:更多關於我的問題的觀點。
我仍然感到困惑類型簽名的「語境」:
(Show a) =>
意味着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
你在爲你的組合符聲明類型嗎?如果沒有,也許你會得到含糊不清的錯誤? – 2011-06-16 12:29:08