some
và many
có thể được định nghĩa là:
some f = (:) <$> f <*> many f
many f = some f <|> pure []
Có lẽ nó giúp để xem cách some
sẽ được viết với monadic do
cú pháp:
some f = do
x <- f
xs <- many f
return (x:xs)
Vì vậy some f
chạy f
một lần, sau đó "nhiều "thời gian và chấp nhận kết quả. many f
chạy f
"một số" lần hoặc "cách khác" chỉ trả về danh sách trống. Ý tưởng là cả hai đều chạy f
càng thường xuyên càng tốt cho đến khi nó "thất bại", thu thập các kết quả trong một danh sách. Sự khác biệt là some f
không thành công nếu f
không thành công ngay lập tức, trong khi many f
sẽ thành công và "trả lại" danh sách trống. Nhưng điều này tất cả có nghĩa là chính xác phụ thuộc vào cách <|>
được xác định.
Chỉ hữu ích khi phân tích cú pháp? Hãy xem những gì nó làm cho các trường hợp trong cơ sở: Maybe
, []
và STM
.
Đầu tiên Maybe
. Nothing
có nghĩa là không thành công, do đó, some Nothing
không thành công và đánh giá thành Nothing
trong khi many Nothing
thành công và đánh giá thành Just []
. Cả hai some (Just())
và many (Just())
không bao giờ trở lại, bởi vì Just()
không bao giờ bị lỗi! Theo nghĩa nào đó, họ đánh giá là Just (repeat())
.
Đối với danh sách, []
nghĩa thất bại, vì vậy some []
đánh giá để []
(không trả lời) trong khi many []
đánh giá để [[]]
(có một câu trả lời và nó là danh sách trống). Một lần nữa some [()]
và many [()]
không trả lại. Mở rộng các cá thể, some [()]
có nghĩa là fmap (():) (many [()])
và many [()]
có nghĩa là some [()] ++ [[]]
, vì vậy bạn có thể nói rằng many [()]
giống với tails (repeat())
.
Đối với STM
, lỗi có nghĩa là giao dịch phải được thử lại. Vì vậy, some retry
sẽ tự thử lại, trong khi many retry
sẽ đơn giản trả về danh sách trống. some f
và many f
sẽ chạy liên tục f
cho đến khi thử lại. Tôi không chắc đây có phải là điều hữu ích hay không, nhưng tôi đoán là không phải vậy.
Vì vậy, đối với Maybe
, []
và STM
many
và some
dường như không hữu ích.Nó chỉ hữu ích nếu ứng dụng có một số loại trạng thái mà làm cho thất bại ngày càng có khả năng khi chạy cùng một điều hơn và hơn. Đối với các trình phân tích cú pháp, đây là đầu vào được thu hẹp lại với mọi kết quả thành công.
@Landei: Tôi đã đọc câu trả lời trong chuỗi đó và tôi vẫn chưa hiểu. – missingfaktor
Tôi chỉ nói câu hỏi này là một bản sao, không phải là bản gốc đã có một câu trả lời tốt :-) Mặc dù nó là đủ tốt cho tôi: Tôi đã tìm ra rằng các chức năng này rất có thể không thú vị cho tôi ... – Landei
@Landei: Tôi đang đạt được kết luận tương tự như bạn đã làm. :-) – missingfaktor