2014-04-04 20 views
11

Đọc qua các hướng dẫn khác nhau về các lớp học theo chủ đề khác nhau của Haskell, chúng tôi tìm thấy những thứ như Monoid, Functor, Monad và cứ thế - tất cả đều có hàng chục trường hợp. Nhưng vì một lý do nào đó, khi chúng tôi đạt đến Arrow, chỉ có hai trường hợp: chức năng và đơn vị. Trong cả hai trường hợp, sử dụng cá thể Arrow ít mạnh mẽ hơn và khó hơn là chỉ sử dụng trực tiếp nội dung cơ bản.Còn mũi tên thì sao?

Có ai có bất kỳ thú vị nào về các mũi tên thú vị không? Tôi chắc chắn phải có một số, nhưng tôi đã không bao giờ đi qua bất kỳ văn bản về họ ...

+0

[Có liên quan] (http: //programmers.stackexchange.com/questions/114681/what-là-the-purpose-of-mũi tên) – bheklilr

+0

Có thể dựa trên mũi tên FRP đủ điều kiện? –

+1

Sự hiểu biết của tôi về các mũi tên trong Haskell là chúng ít nhiều cung cấp cho bạn ngôn ngữ của các mạch, trong đó một thành phần phụ thuộc vào các kết quả đầu ra của trước đó. Bạn có thể hỏi làm thế nào điều này là khác nhau từ thành phần chức năng bình thường và kết hợp, nhưng chức năng bình thường không thể mang thêm bối cảnh và cấu trúc với họ, trong khi mũi tên trừu tượng hơn và có thể. Đây là lý do tại sao chúng rất phổ biến trong FRP, bạn có thể viết mã hiệu quả trông tinh khiết và có thể được lý luận rất dễ dàng. Chúng cũng được sử dụng trong thư viện Hxt để truyền dữ liệu XML thông qua các tính toán có vẻ thuần túy. – bheklilr

Trả lời

7

HXT, một thư viện được sử dụng để phân tích cú pháp XML, là một ví dụ rất tốt cho việc sử dụng các mũi tên (có một cái nhìn thường xuyên từ Arrow xảy ra trong tên mô-đun của gói này!). Bạn sẽ có một cái nhìn về hướng dẫn tuyệt vời: http://adit.io/posts/2012-04-14-working_with_HTML_in_haskell.html

Nhưng cũng nên có khái niệm mũi tên cho các chức năng. Ví dụ mã

((+1) &&& (*2)) 3 -- result is (4,6) 

sau chỉ hoạt động, bởi vì (->) là một thể hiện của lớp mũi tên (Nhà điều hành &&& được định nghĩa trong Control.Arrow).

Nhờ có arrow syntax bạn cũng có một công cụ tuyệt vời để viết các tính toán phức tạp trong Haskell (nó hoạt động tốt cho các hàm, monads và bộ lọc XML trong HXT).

+0

HXT có vẻ khá thú vị. Bất kỳ bình luận nào về lý do tại sao hầu hết các thư viện phân tích cú pháp là các hàm fandom (hoặc monads), nhưng đây là một mũi tên? – MathematicalOrchid

8

Tôi thích nghĩ về Arrow s dưới dạng biểu đồ tuần hoàn có thể kết hợp. Ví dụ, một mũi tên loại:

SomeArrow (a, b, c) (d, e, f) 

... bạn có thể nghĩ đến như một đồ thị có ba cạnh đến kiểu a, bc và ba cạnh đi kiểu d, e, và f .

Sử dụng cách giải thích này, các hoạt động sáng tác thể loại cho Arrow s cũng giống như nối ngang cho đồ thị, kết nối các cạnh của họ với nhau:

(.) :: SomeArrow b c -> SomeArrow a b -> Some Arrow a c 

... nơi a, bc có thể tự tuples. Tương tự như vậy, id chỉ là đồ thị sắc chuyển tiếp tất cả các cạnh đến để cạnh đi:

id :: SomeArrow a a 

Các hoạt động quan trọng khác là (***) mà cũng giống như nối thẳng đứng của đồ thị:

(***) :: Arrow a b -> Arrow c d -> Arrow (a, c) (b, d) 

Bạn có thể nghĩ rằng khi đặt hai đồ thị cạnh nhau, kết hợp các cạnh đầu vào và các cạnh đầu ra của chúng.

Vì vậy, Arrow thường phát sinh khi làm việc với các biểu đồ tuần hoàn có hướng được nhập. Tuy nhiên, lý do bạn thường không nhìn thấy chúng thường là bởi vì hầu hết mọi người liên kết tinh thần đồ thị với cấu trúc dữ liệu không được phân loại và hiệu suất cao.

+0

Có lẽ 'ArrowLoop' là điểm mà tại đó biểu đồ dừng lại theo chu kỳ? – MathematicalOrchid

+1

Điều này vô tình trở thành trung tâm lý do tại sao các mũi tên không hữu ích/phổ biến một cách khủng khiếp. Chúng tôi đã có 'Danh mục' cho những thứ sáng tác và khai báo bằng ngôn ngữ Haskell cho những thứ tồn tại cùng một lúc (bên cạnh nhau), vì vậy tất cả' Arrow' thêm là keo để đặt mọi thứ cạnh nhau, và đưa họ ra xa nhau. Vấn đề là keo không thể thay đổi chỉ là tuple, không đáng lo ngại. Nó thực sự là lỗi của tuple. Hãy tưởng tượng nếu chúng ta thay thế '<*> 'trong' Áp dụng' bằng 'f a -> f b -> f (a, b)'. – Cirdec

+0

@MathematicalOrchid Right –

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