Tôi là người học Haskell rất mới. Tôi có một biểu hiện làm việc:Biểu thức tương đương Haskell
do x <- try parseA <|> parseB
return x
mà dường như hoạt động hoàn hảo (Tôi đang sử dụng gói Parsec
, nhưng tôi hy vọng câu hỏi này không có gì để làm với chức năng của nó, như xa như tôi biết <|>
là một Parsec- toán tử đã được xác định). parseA
và parseB
cả hai đều có loại đơn lẻ Parser Foo
, cũng như toàn bộ biểu thức.
Dựa trên những gì tôi đã đọc cho đến nay, có vẻ như điều này sẽ tương đương với
do return (try parseA <|> parseB)
và
do return $ try parseA <|> parseB
nhưng không ai trong số các biên dịch thứ hai, họ phàn nàn của các loại không phù hợp (lỗi phía dưới).
nỗ lực khác của tôi để viết lại này, như
(try parseA <|> parse B) >>= return
dường như làm việc. Nhưng nếu tôi đã hiểu nhầm điều này, xin hãy nói.
Vì vậy, câu hỏi của tôi là, ai đó có thể giải thích lý do tại sao ba người đầu tiên lại khác nhau. Tôi bối rối vì sao chúng không tương đương. Tôi đang thiếu gì?
lỗi (trong trường hợp này là có liên quan, mặc dù fwiw Tôi không tìm kiếm để 'sửa chữa' mã của tôi - Tôi đã một phiên bản làm việc, tôi đang tìm hiểu làm thế nào các phiên bản khác nhau):
do return (try parseA <|> parseB)
cho
parse.hs:76:11:
Couldn't match expected type ‘Foo’
with actual type ‘Text.Parsec.Prim.ParsecT
[Char]() Data.Functor.Identity.Identity Foo’
và
do return $ try parseA <|> parseB
cho
parse.hs:76:3:
Couldn't match type ‘Text.Parsec.Prim.ParsecT
[Char]() Data.Functor.Identity.Identity Foo’
with ‘Foo’
Expected type: Parser Foo
Actual type: Text.Parsec.Prim.ParsecT
String
()
Data.Functor.Identity.Identity
(Text.Parsec.Prim.ParsecT
[Char]() Data.Functor.Identity.Identity Foo)
Cảm ơn bạn, đây là mẹo tôi cần phải hiểu. Các bit khác mà tôi đã mất là <- không chỉ là một nhiệm vụ, nó sẽ loại bỏ Monad và trả về kiểu cơ bản, vì vậy x <- y thì foo x không tương đương với foo y.Tôi đánh giá cao câu trả lời toàn diện, Rein. – Ian