Có một đại diện van Laarhoven của 'Tùy chọn`


15

Nhiều loại quang học có một đại diện van Laarhoven.

Ví dụ, một Lensloại Lens s t a b có thể được biểu diễn dưới dạng:

 Functor f => (a -> f b) -> s -> f t

Tương tự a Traversal, có thể được biểu diễn theo cách tương tự, hoán đổi Functorràng buộc cho Applicative:

 Applicative f => (a -> f b) -> s -> f t

Một số khung quang học, chẳng hạn như MonocleMũi tên xác định một loại được gọi Optional.

Trong chế độ bá đạo của Monocle Optional phù hợp giữa LensTraversal

Theo tôi hiểu: Nếu a Traversalgiống như Lenscó thể có 0 đối với nhiều mục tiêu, thì một Optionalgiống như Lenscó thể có 0 đối với một mục tiêu.

Trong Monocle, Optionalđược định nghĩa là một cặp hàm:

getOrModify :: s -> Either t a 
set :: (b, s) -> t

Nhận xét trong mã nguồn Monocle cho thấy rằng cũng có thể đại diện cho Optional"càng ngày càng PLensyếu PPrism"

Có thể biểu diễn một Optionalhàm van Laarhoven không?

Câu trả lời:


10

Sẽ có một cách để thể hiện nó nếu hệ thống phân cấp Functor / Applicative / Monad tốt hơn. Đặc biệt:

class Functor f => Pointed f where
    pure :: a -> f a

type Optional s t a b = forall f. Pointed f => (a -> f b) -> s -> f t

Lưu ý rằng loại có thể sẽ được đặt tên Affinetrong thư viện ống kính nếu nó được sắp xếp gọn gàng trong hệ thống phân cấp lớp.


1
Điều này thuận tiện hoàn toàn tốt cho trường hợp sử dụng của tôi, đó là Thư viện Scala Optics "chỉ để giải trí", nơi tôi đã viết Phân cấp Functor từ đầu, và do đó có thể làm bất cứ điều gì tôi thích với nó. Tôi có đúng không khi nghĩ rằng điều này cho thấy rằng nếu tôi cũng có một loại lớp khác giữa FunctorApplicativevới liftA2, nhưng không thuần túy, thì điều đó sẽ định nghĩa một quang với một đến nhiều mục tiêu? Cái này có tên không?
Joe

1
Nó không gợi ý rằng. Tôi không biết cái gì sẽ được gọi là quang.
Carl

4
@Joe Lớp trung gian đó được gọi Applytrong gói "semigroupoids". hackage.haskell.org/package/semigroupoids-5.3.3/docs/iêu
danidiaz

2
... và quang tương ứng trong lensgói được gọi làTraversal1
Benjamin Hodgson

@Carl Làm thế nào chúng ta có thể xác minh rằng đây type Optional s t a bthực sự là đại diện chính xác cho quang đó và tất cả các luật phù hợp có? Đây dường như là một trò ảo thuật. Tại sao là nó Pointedvà không, nói , Copointed? Đối với một quang cụ thể khác, làm thế nào chúng ta có thể đoán đại diện profunctor chính xác?
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.