2015-03-24 15 views
13

Trong Scalazlà nó chỉ là một trùng hợp ngẫu nhiên mà Kleisli, ReaderT, và Reader đều giống nhau ở Scalaz

  • Kleisli[F, A, B] là một wrapper cho A => F[B].
  • ReaderT[F, A, B] - trình biến đổi đơn vị đọc - chỉ là bí danh của Kleisli[F, A, B].
  • Reader[A, B] đơn nguyên là một chuyên môn của ReaderT với danh tính đơn lẻ Id:
    type Reader[A, B] = ReaderT[Id, A, B].

là nó chỉ là một trùng hợp ngẫu nhiên hay có một số sâu lý do mà Kleisli, ReaderTReader là đẳng cấu trong Scalaz?

+2

Reader và ReaderT/Kleisli không phải là đẳng hình (như bạn đã nói, trước đây là chuyên môn hóa của cái sau). – ZhekaKozlov

+0

@ZhekaKozlov Cảm ơn. Tôi đã sai (sẽ không cập nhật câu hỏi). – Michael

Trả lời

21

Bạn có thể nghĩ về điều đó khi đến cùng một địa điểm bằng hai tuyến đường khác nhau. Ở một bên bạn bắt đầu với trình đơn đọc, đơn giản chỉ là một loại trình bao bọc cho các chức năng. Sau đó, bạn nhận ra rằng bạn muốn tích hợp chức năng đọc này vào một đơn vị lớn hơn với các "hiệu ứng" khác, do đó bạn tạo một biến áp đơn lẻ ReaderT. Tại thời điểm đó, bạn nên triển khai Reader[E, ?] gốc của mình là ReaderT[Id, E, ?].

Từ phía bên kia, bạn muốn có loại đại diện cho mũi tên Kleisli (tức là các hàm có kiểu trả lại đơn điệu). Nó chỉ ra rằng đây là điều tương tự như ReaderT, vì vậy bạn chỉ cần làm cho rằng một bí danh.

Không có gì bí ẩn khủng khiếp về phần "nó chỉ ra". Nó giống như nếu bạn bắt đầu với một lớp loại Addable cho những thứ giống như số, sau đó quyết định làm cho nó trở nên chung chung hơn, và cuối cùng kết thúc với một loại lớp chỉ cung cấp một hoạt động "giống như bổ sung". Bạn đã phát minh lại Semigroup! Tuy nhiên, bạn vẫn có thể giữ tên Addable vì lý do lịch sử hoặc sư phạm hoặc chỉ để thuận tiện.

Đó là tất cả những gì đang xảy ra với ReaderReaderT —bạn không cần các bí danh này, nhưng chúng có thể thuận tiện và có thể giúp cải thiện độ rõ của mã của bạn.

+1

Bạn có thể tìm thấy một ví dụ về những gì Travis giải thích ở đây: http://eed3si9n.com/learning-scalaz/Composing+monadic+functions.html – ssanj

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