Có một hình thái đơn nguyên không bản sắc M ~> M là tự nhiên trong M?


8

Được biết, các phép biến đổi tự nhiên với chữ ký loại a -> aphải là các hàm định danh. Điều này theo sau bổ đề Yoneda nhưng cũng có thể được bắt nguồn trực tiếp. Câu hỏi này yêu cầu cùng một tài sản nhưng cho hình thái đơn nguyên thay vì biến đổi tự nhiên.

Xem xét các hình thái đơn nguyên M ~> Ngiữa các đơn nguyên . (Đây là những biến đổi tự nhiên M a -> N amà gìn giữ các hoạt động đơn nguyên trên cả hai mặt. Những biến đổi là những morphisms trong danh mục của monads.) Chúng ta có thể đặt câu hỏi liệu có tồn tại một cấu xạ đơn nguyên e :: (Monad m) => m a -> m amà làm việc trong cùng một cách cho mỗi đơn nguyên m. Nói cách khác, một hình thái đơn nguyên ephải là tự nhiên đơn nguyên trong tham số loại đơn nguyên m.

Luật tự nhiên đơn nguyên nói rằng, đối với bất kỳ hình thái đơn nguyên f: M a -> N a giữa bất kỳ hai đơn vị M và N, chúng ta phải có f . e = e . fcác tham số loại phù hợp.

Câu hỏi là, chúng ta có thể chứng minh rằng bất kỳ echức năng nào phải là một chức năng nhận dạng không, hoặc có một ví dụ ngược lại của một hình thái đơn nguyên không bản sắc eđược định nghĩa là

  e :: (Monad m) => m a -> m a
  e ma = ...

Một lần thất bại để xác định như vậy elà:

 e ma = do
         _ <- ma
         x <- ma
         return x

Một nỗ lực thất bại khác là

 e ma = do
         x <- ma
         _ <- ma
         return x

Cả hai nỗ lực này đều có chữ ký loại chính xác nhưng thất bại trong các luật hình thái đơn nguyên.

Dường như bổ đề Yoneda không thể được áp dụng cho trường hợp này bởi vì không có hình thái đơn nguyên Unit ~> Mnào Unitlà đơn vị đơn vị. Tôi cũng không thể tìm thấy bất kỳ bằng chứng trực tiếp.

Câu trả lời:


2

Tôi nghĩ rằng bạn đã cạn kiệt tất cả các khả năng thú vị. Bất kỳ Monad m => m a -> m achức năng nào chúng tôi có thể xác định sẽ trông giống như thế này:

e :: forall m a. Monad m => m a -> m a
e u = u >>= k
    where
    k :: a -> m a
    k = _

Đặc biệt, nếu k = return, e = id. Để ekhông tồn tại id, kphải sử dụng u theo cách không cần thiết (ví dụ: k = const uk = flip fmap u . constsố tiền cho hai lần thử của bạn). Tuy nhiên, trong trường hợp như vậy, các uhiệu ứng sẽ được nhân đôi, dẫn eđến thất bại trong việc biến thành một hình thái đơn nguyên cho một số lựa chọn của đơn nguyên m. Điều đó là như vậy, hình thái đơn nguyên duy nhất đa hình trong đơn nguyên là id.


Hãy làm cho lập luận rõ ràng hơn.

Để rõ ràng, tôi sẽ chuyển sang join/ return/ fmapthuyết trình một lát. Chúng tôi muốn thực hiện:

e :: forall m a. Monad m => m a -> m a
e u = _

Những gì chúng ta có thể điền vào phía bên tay phải với? Lựa chọn rõ ràng nhất là u. Chính nó, điều đó có nghĩa là e = id, điều đó không có vẻ thú vị. Tuy nhiên, vì chúng ta cũng có join, returnfmap, có tùy chọn suy luận theo quy nạp, unhư trường hợp cơ sở. Nói rằng chúng tôi có một số v :: m a, được xây dựng bằng cách sử dụng các phương tiện chúng tôi có trong tay. Ngoài vra, chúng ta có các khả năng sau:

  1. join (return v), đó là vvà do đó không cho chúng ta biết bất cứ điều gì mới;

  2. join (fmap return v), đó là vtốt; và

  3. join (fmap (\x -> fmap (f x) w) v), đối với một số khác w :: m ađược xây dựng theo quy tắc của chúng tôi, và một số f :: a -> a -> a. (Thêm mlớp để các loại f, như trong a -> a -> m a, và thêm joins để loại bỏ chúng sẽ không dẫn bất cứ nơi nào, như sau đó chúng ta sẽ phải thể hiện xuất xứ của những lớp, và điều cuối cùng sẽ làm giảm các trường hợp khác).

Trường hợp thú vị duy nhất là # 3. Tại thời điểm này, tôi sẽ đi một lối tắt:

join (fmap (\x -> fmap (f x) w) v)
    = v >>= \x -> fmap (f x) w
    = f <$> v <*> w

Bất kỳ phi uphía bên tay phải, do đó, có thể được thể hiện dưới dạng f <$> v <*> w, với vwlà một trong hai uhoặc lặp đi lặp lại hơn nữa của mô hình này, cuối cùng đạt us ở lá. Tuy nhiên, các biểu thức áp dụng của loại này có dạng chính tắc, có được bằng cách sử dụng các luật áp dụng để liên kết lại tất cả các cách sử dụng (<*>)bên trái, trong trường hợp này phải như thế này ...

c <$> u <*> ... <*> u

... Với dấu chấm lửng đứng ở vị trí 0 hoặc nhiều lần xuất hiện khác của khoảng ucách <*>clà một a -> ... -> a -> achức năng của sự tự nhiên thích hợp. Do alà đa hình hoàn toàn, cnên, theo tham số, phải là một consthàm giống như một số đối số chọn một trong các đối số của nó. Điều đó là như vậy, bất kỳ biểu hiện như vậy có thể được viết lại về (<*)(*>)...

u *> ... <* u

... Với dấu chấm lửng đứng bằng 0 hoặc nhiều lần xuất hiện ucách nhau bởi một trong hai *>hoặc <*, không có *>bên phải của a <*.

Quay trở lại bắt đầu, tất cả các idtriển khai không phải là ứng cử viên phải trông như thế này:

e u = u *> ... <* u

Chúng tôi cũng muốn etrở thành một hình thái đơn nguyên. Kết quả là, nó cũng phải là một hình thái ứng dụng. Đặc biệt:

-- (*>) = (>>) = \u v -> u >>= \_ -> v
e (u *> v) = e u *> e v

Đó là:

(u *> v) *> ... <* (u >* v) = (u *> ... <* u) *> (v *> ... <* v)

Bây giờ chúng ta có một con đường rõ ràng hướng tới một ví dụ mẫu. Nếu chúng ta sử dụng các luật áp dụng để chuyển đổi cả hai mặt sang dạng chính tắc, chúng ta sẽ (vẫn) kết thúc với các us và s xen kẽ vở phía bên trái và với tất cả các vs sau tất cả các us ở phía bên tay phải. Điều đó có nghĩa là tài sản sẽ không giữ cho các đơn vị như IO, Statehoặc Writer, bất kể có bao nhiêu (*>)(<*)e, hoặc chính xác giá trị nào được chọn bởi các consthàm giống như ở hai bên. Một bản demo nhanh:

GHCi> e u = u *> u <* u  -- Canonical form: const const <$> u <*> u <*> u
GHCi> e (print 1 *> print 2)
1
2
1
2
1
2
GHCi> e (print 1) *> e (print 2)
1
1
1
2
2
2

Tôi không thể tìm thấy một bằng chứng đủ nghiêm ngặt. Làm thế nào chúng ta có thể chứng minh rằng các hiệu ứng của usẽ nhất thiết phải được nhân đôi trừ khi e = id? (Chúng tôi cũng có thể viếte u = do _ <- u; _ <- u; _ <- u; u và kết hợp thêm u-effects.) Làm thế nào chúng ta có thể mô tả toán học rằng "một giá trị monadic p :: m acó nhiều hiệu ứng sao chép từ u :: m a? Và sau đó, làm thế nào chúng ta có thể chứng minh rằng nhân đôi (triplicated, vv) u-effects nhất thiết dẫn đến hành vi vi phạm luật hình thái đơn nguyên?
winitzki

@winitzki Tôi đã viết ra lập luận của tôi rõ ràng hơn. Một suy nghĩ mà tôi chắc chắn đã cam kết trong lần sửa đổi ban đầu của câu trả lời là đề cập đến tính không ổn định, cho rằng những thất bại mà tôi đã quan sát thấy có liên quan nhiều hơn đến hiệu ứng giao hoán.
song công

Hay đấy. Tôi sẽ phải suy nghĩ thêm về nó. Làm thế nào chúng ta có thể chứng minh rằng chỉ có một cách để thực hiện một cách không cần thiết e u, đó là sử dụng một số biểu thức của biểu mẫu u *> ... <* unhư bạn mô tả? Tại sao chúng ta không thể tìm thấy một số kết hợp thông minh và phức tạp khác củafmap , returnjoin, để chúng ta có được cái gì khác? Nó cũng là một động thái tốt để xem xét các hình thái ứng dụng. Có thể dễ dàng chứng minh tính chất tương tự cho các hình thái ứng dụng hơn là các hình thái đơn nguyên. (Các hình thái ứng dụng duy nhất có tính ứng dụng tự nhiên là các hình thái nhận dạng?)
winitzki

@winitzki (1) Mặc dù thật tuyệt khi có một bài thuyết trình kết tinh hơn (tôi vẫn đang suy nghĩ về nó), tôi tin rằng ba trường hợp của tôi là toàn diện. Chỉ join _có thể dẫn đến một idkết quả không , và # 3 là cách duy nhất sẽ không dẫn đến idhoặc hồi quy vô hạn. (2) Bật Applicative: không chính thức, nếu mũi tên Kleisli duy nhất của bạn là return, bạn sẽ không sử dụng thêm năng lượngMonad mang lại, vì vậy bạn cũng có thể làm việc với Applicative. (3) Yup, thuộc tính tương tự giữ cho các hình thái ứng dụng. Phần tranh luận của tôi bắt đầu bằng hình thức kinh điển, khép kín, nên đủ để làm bằng chứng.
song công

Nếu chúng ta có một hình thái đơn nguyên là tự nhiên, chúng ta cũng sẽ có một hình thái ứng dụng là tự nhiên. Tôi nghĩ rằng có thể dễ dàng hơn để chứng minh rằng không có hình thái ứng dụng như vậy.
winitzki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.