Tôi rất ngạc nhiên vì tôi không thể tìm thấy bất kỳ thông tin nào về vấn đề này. Tôi phải là người duy nhất gặp rắc rối với nó.Cách sử dụng Control.Monad.State với Parsec?
Vì vậy, giả sử tôi có bộ đếm dấu gạch ngang. Tôi muốn nó đếm số lượng dấu gạch ngang trong chuỗi và trả về chuỗi. Giả sử tôi đưa ra một ví dụ không hoạt động khi sử dụng xử lý trạng thái của parsec. Vì vậy, điều này sẽ hoạt động:
dashCounter = do
str <- many1 dash
count <- get
return (count,str)
dash = do
char '-'
modify (+1)
Và thực sự, điều này biên dịch. OK, vì vậy tôi cố gắng sử dụng nó:
:t parse dashCounter "" "----"
parse dashCounter "" "----"
:: (Control.Monad.State.Class.MonadState
t Data.Functor.Identity.Identity,
Num t) =>
Either ParseError (t, [Char])
Được rồi, điều đó có ý nghĩa. Nó sẽ trả về trạng thái và chuỗi. Mát mẻ.
>parse dashCounter "" "----"
<interactive>:1:7:
No instance for (Control.Monad.State.Class.MonadState
t0 Data.Functor.Identity.Identity)
arising from a use of `dashCounter'
Possible fix:
add an instance declaration for
(Control.Monad.State.Class.MonadState
t0 Data.Functor.Identity.Identity)
In the first argument of `parse', namely `dashCounter'
In the expression: parse dashCounter "" "----"
In an equation for `it': it = parse dashCounter "" "----"
Rất tiếc. Nhưng sau đó làm thế nào nó có thể đã bao giờ hy vọng để làm việc ở nơi đầu tiên? Không có cách nào để nhập trạng thái ban đầu.
Ngoài ra còn có một chức năng:
>runPT dashCounter (0::Int) "" "----"
Nhưng nó mang lại một lỗi tương tự.
<interactive>:1:7:
No instance for (Control.Monad.State.Class.MonadState Int m0)
arising from a use of `dashCounter'
Possible fix:
add an instance declaration for
(Control.Monad.State.Class.MonadState Int m0)
In the first argument of `runPT', namely `dashCounter'
In the expression: runPT dashCounter (0 :: Int) "" "----"
In an equation for `it':
it = runPT dashCounter (0 :: Int) "" "----"
Tôi cảm thấy mình cần phải chạyState trên đó hoặc có chức năng đã thực hiện nội bộ, nhưng tôi không thể tìm ra nơi để đi từ đây.
Chỉnh sửa: Tôi phải xác định rõ ràng hơn, tôi không muốn sử dụng xử lý trạng thái của parsec. Lý do là tôi có một cảm giác tôi không muốn backtracking của nó để ảnh hưởng đến những gì nó thu thập với các vấn đề tôi đang chuẩn bị để giải quyết nó với.
Tuy nhiên, ông McCann đã tìm ra cách này phải phù hợp với nhau và mã cuối cùng sẽ trông như thế này:
dashCounter = do
str <- many1 dash
count <- get
return (count,str)
dash = do
c <- char '-'
modify (+1)
return c
test = runState (runPT dashCounter() "" "----------") 0
Thanks a lot.
Hãy xem điều này: http://stackoverflow.com/questions/6477541/user-state-in-parsec – bzn