2014-04-15 15 views
6

Lợi thế của các mũi tên trên các hàm thường xuyên trong haskell là gì. Những gì họ có thể làm các chức năng không thể. Các hàm có thể ánh xạ trên các cấu trúc bằng cách sử dụng fmap.Lợi thế của các mũi tên trên các hàm

Trả lời

6

Trên hình ảnh rộng hơn, các mũi tên đưa bạn ra khỏi Hask và vào các danh mục khác cần khám phá. Danh mục Kleisli có lẽ là người quen thuộc nhất với Haskellers, theo sau là Cokleisli. Đó là những "phần mở rộng" tự nhiên của Hask: thêm một endofunctor xung quanh hoặc là kết quả hay cãi nhau, sau đó bạn sẽ có được một loại một lần nữa nếu

  • Kleisli: các functor là một đơn nguyên, vì vậy id ≅ return :: a -> m a

    (.) ≅ (<=<) :: (b->m c) -> (a->m b) -> a->m c 
    
  • CoKleisli: các functor là một comonad, vì vậy id ≅ coreturn :: m a -> a

    (.)  ::  (m b->c) -> (m a->b) -> m a->c 
    

(Vì bạn không cần Arrow, chỉ Category. Nhưng loại nói chung không phải là rất thú vị, bạn thường muốn monoidal hoặc thậm chí Descartes đóng loại, đó là những gì Arrow được khoảng hướng tới.)

Nhưng có chắc chắn được rất nhiều other categories.Hầu hết không có nhiều việc phải làm với Hask và không thể được thể hiện với lớp tiêu chuẩn Arrow, chủ yếu là do các đối tượng có đặc tính đặc biệt mà không phải mọi loại Haskell đều đáp ứng. Trên thực tế, nếu bạn thêm khả năng hạn chế các loại đối tượng, the possibilities immediately become much wider. Nhưng ngay cả khi bạn ở lại với các lớp tiêu chuẩn, có lẽ chỉ đơn giản là trong ->, phong cách thành phần không có điểm tự nhiên với các mũi tên thường xuất hiện rất đẹp, súc tích và mở ra những cách mới để suy nghĩ về các phép biến đổi.

3

Chức năng chỉ là một thể hiện của các mũi tên, nó giống như yêu cầu "Tại sao nên sử dụng monads thay vì chỉ Maybe".

Mọi thứ bạn có thể làm với các mũi tên đều có thể được thực hiện với các hàm kể từ khi cá thể Arrow (->) chỉ có thể nói về một phần nhỏ chức năng, cụ thể là trong lớp loại Arrow. Tuy nhiên, các mũi tên có nhiều cá thể hơn các hàm đơn giản, vì vậy chúng ta có thể sử dụng các hàm ssame để hoạt động trên các kiểu phức tạp hơn.

Mũi tên đẹp vì chúng có thể có nhiều cấu trúc hơn chỉ là một hàm, khi duyệt ngang chỉ với fmap, chúng tôi không có cách nào để tích lũy hiệu ứng, mang tính biểu cảm hơn so với các đơn vị! Xem xét mũi tên Kleisli,

newtype Kleisli m a b = Kleisli {runKleisli :: a -> m b} 

Điều này tạo thành mũi tên khi m là một đơn nguyên. Vì vậy, mỗi Monad tạo thành một mũi tên và do đó chúng tôi có thể xây dựng tính toán đơn thuần bằng cách liên tục sáng tác a -> m b và thực hiện tất cả những thứ hữu ích như thế này. Một số thư viện XML sử dụng các mũi tên để trừu tượng hóa các hàm từ một phần tử tới các phần tử con của nó và sử dụng nó để duyệt qua tài liệu. Các trình phân tích cú pháp khác sử dụng các mũi tên (mục đích ban đầu của chúng) mặc dù ngày nay điều này dường như không có lợi cho Applicative. Điểm mà bạn hy vọng nhận thấy là các mũi tên chung chung hơn, khi chúng ta chỉ nói về mũi tên, chúng ta tránh sao chép tất cả mã mà chúng ta cần viết để làm điều gì đó với các trình phân tích cú pháp, trình gỡ xml và monadic của chúng ta chức năng!

Nó cũng giống như chọn cho Monad qua Maybe, chúng tôi mất một số quyền lực vì chúng tôi không còn có thể đưa ra các tuyên bố cụ thể nữa, nhưng chúng tôi nhận được mã chung chung hơn.

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