Tôi muốn viết
integer :: Parser Integer
integer = read <$ many1 space <*> many1 digit
Có một loạt các kết trái (như ứng dụng) phân tích cú pháp xây dựng các nhà khai thác <$>
, <*>
, <$
, <*
. Điều ở phía xa bên trái phải là hàm thuần túy mà tập hợp giá trị kết quả từ các giá trị thành phần. Điều bên phải của mỗi nhà điều hành phải là một trình phân tích cú pháp, chung cho các thành phần của ngữ pháp từ trái sang phải. Toán tử nào sử dụng tùy thuộc vào hai lựa chọn, như sau.
the thing to the right is signal/noise
_________________________
the thing to the left is \
+-------------------
pure/| <$> <$
a parser | <*> <*
Vì vậy, sau khi chọn read :: String -> Integer
như chức năng thuần túy mà sẽ cung cấp những ngữ nghĩa của bộ phân tích, chúng ta có thể phân loại các không gian hàng đầu là "tiếng ồn" và loạt các chữ số là "tín hiệu", do đó
read <$ many1 space <*> many1 digit
(..) (.........) (.........)
pure noise parser |
(.................) |
parser signal parser
(.................................)
parser
Bạn có thể kết hợp nhiều khả năng với
p1 <|> ... <|> pn
và bất khả nhanh với
empty
Ít khi cần thiết để đặt tên các thành phần trong trình phân tích cú pháp và mã kết quả trông giống như ngữ pháp có ngữ nghĩa bổ sung.
Tại sao 'const'? – MathematicalOrchid
Chúng ta muốn bỏ qua giá trị (nhưng không phải là hiệu ứng) của 'many1 space', và áp dụng' read' cho giá trị 'many1 digit'. (Xin lỗi, tôi vừa vào, trễ rồi, tôi mệt rồi: Tôi đang chơi nhanh và lỏng lẻo với thuật ngữ.) Nếu bạn tưởng tượng 's' và' d' đại diện cho giá trị của 'many1 space' và' tương ứng với 1 chữ số, sau đó giá trị (bỏ qua hiệu ứng) của 'const đọc <$> many1 space <*> many1 digit' là' const read sd' = 'read d'. – dave4420