這樣做的目的是使用StateT充當分析器實施(<++)內一個Haskell解析器
import Control.Monad.State
type Parser = StateT String []
runParser :: Parser a -> String -> [(a,String)]
runParser = runStateT
parser :: (String -> [(a,String)]) -> Parser a
parser = StateT
(<++) :: Parser a -> Parser a -> Parser a
從這個基礎上,我怎樣可以實現<實施< ++在Haskell ++因此它反映了Text.ParserCombinators.ReadP
本地排他性左偏向選擇:如果左側解析器本地產生任何結果,則不使用右側解析器。
不知道如何解決這個問題。我不知道如何對第一個解析器應用優先級,以便如果成功,程序不會去檢查第二個解析器。然後失敗後,代碼檢查第二個解析器。如果我只是想將兩個解析器結合使用,我可以使用mplus或msum,但是我不確定如何將其減少到僅返回1的值。我不知道如何解決這個問題。 – Kayanda
從思考一個失敗的解析鬆開開始。 – mnoronha
一個空列表是正確的,但問題是,如果兩個解析器都成功並被組合,我會得到兩個結果。在這種情況下,我只希望第一個解析器成功。如果第一個或第二個失敗,則(<++)等同於'mplus'。如果兩者都成功,那麼它們就不再是等價的。我應該如何處理這種情況 – Kayanda