15

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 somemany để đư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 somemany dưới dạng m 's somemany, 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, somemany 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]many :: m a -> [a] đáp ứng luật này, vì vậy nên some :: Cont r m a -> Cont r m [a]many :: Cont r m a -> Cont r m [a].

Trả lời

4

số

Có tồn tại không có mũi tên từ

(forall a. f a -> f [a]) -> 
(forall r. ((a -> f r) -> f r)) -> (([a] -> f r) -> f r)` 

mà làm cho sử dụng các đối số của nó theo một cách thú vị.

Nơi duy nhất forall a. f a -> f [a] có thể được áp dụng là f r. Đây là kết quả của (a -> f r) -> f r, như trong "tùy chọn hiển thị" của bạn và ([a] -> f r). Điều này để lại kết quả của loại f [r]. Điều duy nhất có thể được thực hiện với một forall r. Alternative f => f [r] để tạo ra một f r là chỉ số f [r] với một số chức năng một phần forall r. [r] -> r từ một số tự nhiên đến một số số tự nhiên không lớn hơn khác.

+0

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

+0

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

+0

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

Các vấn đề liên quan