我正在嘗試決議標志的排列。我想要的行為是“以任何順序標記一個或多個標記,不重復”。我正在使用以下軟體包:
- 百萬秒差距
- 決議器組合器
我擁有的代碼正在輸出我想要的內容,但對輸入過于寬松。我不明白為什么它接受多個相同的標志。我在這里做錯了什么?
pFlags :: Parser [Flag]
pFlags = runPermutation $ f <$>
toPermutation (optional (GroupFlag <$ char '\'')) <*>
toPermutation (optional (LeftJustifyFlag <$ char '-'))
where f a b = catMaybes [a, b]
例子:
"'-" = [GroupFlag, LeftJustifyFlag] -- CORRECT
"-'" = [LeftJustifyFlag, GroupFlag] -- CORRECT
"''''-" = [GroupFlag, LeftJustifyFlag] -- INCORRECT, should fail if there's more than one of the same flag.
uj5u.com熱心網友回復:
而不是toPermutationwith optional,我相信你需要使用toPermutationWithDefault,像這樣(未經測驗):
toPermutationWithDefault Nothing (Just GroupFlag <$ char '\'')
推理在論文“決議排列短語”(PDF)的第 4 節“添加可選元素”(強調添加)中進行了描述:
例如,考慮 [...] a、b和c 的所有排列。假設b可以為空并且我們想要識別ac。這可以用三種不同的方式來完成,因為空b之前可識別的一個,后一個或后?。幸運的是,它與決議的結果無關,其中恰好是空b是派生的,因為順序并不重要。這允許我們使用類似于 Cameron 提出的策略:決議所見的非空成分,如果所有剩余元素都是可選的,則允許決議器停止。當決議器停止時,所有未被識別的可選元素都會回傳默認值。
為了實作這個策略,我們需要能夠確定決議器是否可以匯出空字串并將其拆分為默認值和非空部分,即行為相同但不識別空字串的決議器。
也就是說,置換決議器需要知道哪些元素可以在不消耗輸入的情況下成功,否則會太急于提交到一個分支。不過,我不知道為什么這會導致接受元素的倍數;也許你還缺少一個eof?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/393122.html
下一篇:按下按鈕時中斷while回圈
