Có một khái niệm về một cái gì đó giống như functor đồng ứng dụng ngồi giữa comonads và functor?


17

Bất kỳ đơn nguyên cũng là một functor ứng dụng và bất kỳ functor ứng dụng là một functor. Ngoài ra, bất kỳ comonad là một functor. Có một khái niệm tương tự giữa comonad và functor, một cái gì đó giống như functor đồng ứng dụng, và các thuộc tính của nó là gì?

Chức năngChức năngFunctor ứng dụng???Đơn nguyênComonad

Cập nhật: Tôi cũng quan tâm đến việc sử dụng có thể của một khái niệm như vậy.


Bạn có chắc là bạn không tìm kiếm Comonads -> ??? -> Đồng sáng lập?
josiah

1
@josiah Không, theo như tôi biết, comonads là functor , không phải cofunctor.
Petr Pudlák

1
Không chia hết mảnh đó sao?
Gus

Câu trả lời:


15

Đầu tiên:

Bất kỳ đơn nguyên cũng là một functor ứng dụng và bất kỳ functor ứng dụng là một functor.

Điều này đúng trong bối cảnh của Haskell, nhưng (đọc Applicativelà "functor đơn hình mạnh mẽ lỏng lẻo") nói chung, vì lý do khá tầm thường mà bạn có thể có các functor "ứng dụng" giữa các thể loại đơn hình khác nhau, trong khi các đơn nguyên (và comonad) là endofunctor .

Hơn nữa, việc xác định Applicativevới functor đơn hình lỏng lẻo là hơi sai lệch, bởi vì để biện minh cho tên (và chữ ký loại (<*>)) yêu cầu một functor giữa các thể loại đơn hình khép kín bảo tồn cả cấu trúc đơn hìnhhom nội bộ . Điều này có thể được gọi một cách hợp lý là "functor đơn hình khép kín lỏng lẻo", ngoại trừ việc một functor giữa các loại đóng đơn hình bảo tồn một trong hai tài sản bảo tồn cái kia theo cách rõ ràng . Bởi vì Applicativechỉ mô tả endofunctor trên Hask bảo tồn cấu trúc đơn hình của (,), nên các thể hiện của nó có được rất nhiều thuộc tính tự động, bao gồm cả sức mạnh của chúng , do đó có thể bị loại bỏ.

Mối liên hệ rõ ràng với Monadđược cho là một sự giả tạo của những hạn chế ngầm trong việc Applicativekhiến các khía cạnh của các cấu trúc đơn hình tương ứng của chúng trùng khớp với nhau, một sự trùng hợp hạnh phúc không may không tồn tại đối ngẫu.

Giống như một comonad trên thể loại là một đơn nguyên trên , một functor đơn hình oplax là một functor đơn hình lỏng lẻo . Nhưng không được đóng đơn hình và một đồng không bao gồm ứng dụng chức năng hầu như không xứng đáng với tên đó. Dù sao, kết quả sẽ không thú vị lắm:C o p C D C o pD o pCCop CDCopDopHmộtSkopApplicative

class (Functor f) => CoMonoidal f where
    counit :: f () -> ()
    cozip :: f (a, b) -> (f a, f b)

Thay vào đó, chúng ta có thể tưởng tượng một khái niệm về "functor đóng colax", trông sẽ giống như Applicativenếu nó tồn tại. Thật không may, không phải là (theo sự hiểu biết tốt nhất của tôi) là một thể loại khép kín: in tương ứng với các hình thái in , nhưng không hoạt động như một ngôi nhà nội bộ ở đó - bởi vì các mũi tên được đảo ngược một số loại chức năng đồng thời sẽ được yêu cầu, mà chúng ta không thể định nghĩa chung cho . H a s k b a H a s k o pHmộtSkopnewtype Op b a = Op (a -> b)HmộtSkbmộtHmộtSkopOp b aHmộtSk

Nếu chúng ta chỉ đơn giản giả vờ rằng "functor đóng colax" tồn tại cho , và hơn nữa hoạt động theo cách chúng ta hy vọng họ sẽ ngây thơ, một đồng dựa trên đó có thể sẽ trông như thế này:HmộtSkApplicative

class (Functor f) => CoApplicative f where
    copure :: f a -> a
    coap :: (f a -> f b) -> f (a -> b)

Thêm duplicate :: f a -> f (f a)vào copuresẽ tạo ra một comonad (giả sử luật pháp được thỏa mãn), tất nhiên. Nhưng không có mối quan hệ rõ ràng giữa - coapdù nó có thể là gì - và extend :: (f a -> b) -> f a -> f b. So sánh các loại có thể thấy rõ rằng sự đối ngẫu đang diễn ra theo những cách khác nhau: các cấu trúc hình khối nằm bên dưới duplicatecozipít liên quan đến nhau hoặc với coap(dù có lẽ không có ý nghĩa gì), trong khi liftA2 (,)(<*>)tương đương và có thể được bắt nguồn từ đó join.

Một cách khác có thể đối ngẫu Applicative, mà thậm chí còn ít liên quan đến comonad, là xem xét các functor đơn hình chống chỉ định:

class (Contravariant f) => ContraMonoidal f where
    contraunit :: f a
    contrazip :: f a -> f b -> f (Either a b)

Nhưng điều này xảy ra với các vấn đề tương tự như trên, cụ thể là không phải là một danh mục đóng. Nếu nó là, chúng ta sẽ có một số loại như vậy mà chúng ta có thể viết các chức năng như và và vân vân mà thực sự làm việc như mong đợi.HmộtSkopb <~ acontracurry :: (Either c b <~ a) -> (c <~ (b <~ a))contraapply :: b -> Either a (a <~ b)

Nếu bộ nhớ phục vụ cho tôi, các chướng ngại vật ở đây không dành riêng cho Haskell, mà phát sinh từ bị đóng cartesian (tất nhiên là vẫy tay thông thường), một tài sản mà nó chia sẻ với hầu hết các phép tính lambda được gõ, vì vậy bạn không có khả năng đi rất xa với hầu hết các cài đặt.HmộtSkCoApplicative

Tuy nhiên, trong một thể loại khép kín đơn nhân, hiếu khách hơn để đối ngẫu, bạn có thể gặp may mắn hơn. Cụ thể, tôi tin rằng cả hai Kleisli (Cont r)và thể loại đối lập của nó đều đóng kín, vì vậy đó có thể là bối cảnh tốt hơn để khám phá những ý tưởng này.


So sánh câu trả lời của bạn với cstheory.stackexchange.com/a/22302/989 , thật đáng ngạc nhiên khi bạn không nhân đôi sản phẩm thành tổng. Tất nhiên, bạn đúng rằng Hask không có khoản tiền phân loại; nhưng nếu bạn sẵn sàng giới hạn trong danh mục tổng số chương trình (như trong Agda), hãy giả vờ nó được đặt ngay bây giờ, vấn đề đó sẽ biến mất. (Tôi không nói Set ^ op là đơn hình đóng, nhưng tôi nghi ngờ những gì tôi đang nói ngụ ý nó).
Blaisorblade

8

Trong bài đăng này trên SO tôi đã tìm thấy một câu trả lời thú vị - functor quyết định . Nếu chúng ta thay thế ()bằng Void, (,)bằng Either đảo ngược các mũi tên, chúng ta sẽ nhận được:

class Functor f => Decisive f where
    nogood :: f Void -> Void
    orwell :: f (Either s t) -> Either (f s) (f t)

Bài đăng trên blog cũng đưa ra một số luật mà các functor quyết định tuân thủ.

Và, tất cả Comonadcũng là Decisive:

instance Comonad c => Decisive c where
    nogood = counit
    orwell story = case counit story of
                     Left s  -> fmap (either id (const s)) story
                     Right t -> fmap (either (const t) id) story 

Vì vậy, functor quyết định phù hợp giữa functor và comonads, giống như functor ứng dụng phù hợp giữa functor và monad.


6

McBride và Patterson (Phần 7) cho thấy rằng một functor ứng dụng, còn được gọi là một thành ngữ, là một functor đơn hình lỏng lẻo mạnh mẽ . Bạn đang tìm kiếm một functor mạnh đơn colax mạnh mẽ còn được gọi là một functor oplax monoidal mạnh . Như đã đề cập trong một bình luận, một functor đơn hình oplax là một functor đơn hình lỏng lẻo giữa các thể loại đối diện, kết thúc là một phiên bản comonoidal của một functor đơn hình lỏng lẻo.

Vẽ sơ đồ, đảo ngược các mũi tên!

Tôi phải dành một chút thời gian để tìm hiểu chi tiết để xem nó là gì và để dịch nó thành một khái niệm lập trình chức năng.


Vì một số lý do, thuật ngữ tiêu chuẩn dường như là "functor opoid đơn hình". Ý tưởng là một functor đơn hình lỏng lẻo giữa các thể loại đối nghịch, kết thúc là một phiên bản đơn hình của một functor đơn hình lỏng lẻo. Sử dụng "colax comonoidal" là dư thừa hoặc tương đương với "lax monoidal".
CA McCann

Tôi dùng quá nhiều "đồng". Tôi sẽ sửa câu trả lời của tôi.
Dave Clarke
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.