Chúng ta có thể xác định các biến tiếp tục đơn nguyên nhưBiến thể đơn nguyên tiếp tục có thể được đưa ra một trường hợp Thay thế với một số và nhiều không?
data Cont r m a = Cont {run :: (a -> m r) -> m r}
Chúng tôi có thể cung cấp cho Cont r m
một thể thay thế nếu m
là thành viên của Alternative
qua
empty = Cont $ \f -> empty
ca <|> cb = Cont $ \f -> run ca f <|> run cb f
Và sau đó cho phép some
và many
để đưa vào mặc định của họ phương pháp. Câu hỏi của tôi là, chúng tôi có thể xác định some
và many
dưới dạng m
's some
và many
, thay vì định nghĩa mặc định? Các tùy chọn hiển nhiên rõ ràng
some ca = Cont $ \f -> some $ run ca f
many ca = Cont $ \f -> many $ run ca f
rõ ràng là không hoạt động (thậm chí không kiểm tra kiểu). Có cách nào khác để sử dụng chúng (nếu chúng ta cần m
cũng là một đơn nguyên, điều đó tốt)?
Để tham khảo, some
và many
phải là giải pháp tối thiểu để các phương trình:
some v = (:) <$> v <*> many v
many v = some v <|> pure []
Giả sử rằng some :: m a -> m [a]
và many :: m a -> [a]
đáp ứng luật này, vì vậy nên some :: Cont r m a -> Cont r m [a]
và many :: Cont r m a -> Cont r m [a]
.
Nếu 'r' có một số cấu trúc bổ sung, tuy nhiên, có lẽ điều gì đó có thể được thực hiện. Ví dụ có lẽ chúng ta có thể 'fmap fold'' f [r] ', và với các định luật phù hợp có thể tương đương. – luqui
Tôi sẽ cầu xin sự khác biệt. 'some ca = Cont $ \ fla -> chạy ca $ \ a -> (một số $ tinh khiết a) >> = fla' là loại thú vị. Câu hỏi đặt ra là liệu đây có phải là một phiên bản 'some' hợp lệ hay không. – PyRulez
Bạn không thể nhận '[a]' trong một 'f [a]' như 'một số $ pure a' chỉ với một ràng buộc' Alternative f'. Bạn cần hoặc là 'Monad f' hoặc' Traversable f' để làm bất cứ điều gì với nó. – Cirdec