Đầ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 Applicative
là "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 Applicative
vớ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ình và hom 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ì Applicative
chỉ 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 Applicative
khiế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 p → D o pCCo p C→ DCo p→ Do pHa s ko pApplicative
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ư Applicative
nế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 pHa s ko pnewtype Op b a = Op (a -> b)
Ha s kb → aHmộts ko pOp b a
Ha s k
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:Ha s kApplicative
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 copure
sẽ 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 - coap
dù 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 duplicate
và cozip
ít liên quan đến nhau hoặc với coap
(dù có lẽ không có ý nghĩa gì), trong khi liftA2 (,)
và (<*>)
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.Ha s ko pb <~ a
contracurry :: (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.Ha s kCoApplicative
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.