2012-02-03 39 views
21

Tôi muốn đọc thêm về nhà điều hành -> của haskell. Tôi không thực sự rõ ràng về nó làm mờ bao nhiêu dòng giữa cú pháp đặc biệt và một số loại lớp, và tôi muốn làm một số poking xung quanh. Specificalyl, Tôi đã nhìn thấy những thông tin như sau:Tôi có thể đọc thông tin về toán tử "->" ở đâu?

instance Monad ((->) r) where ... 

Điều đó đã khiến tôi quan tâm.

Tuy nhiên, khi tôi cố gắng tìm kiếm "haskell arrow" hoặc "haskell function" hoặc "haskell class function", tôi gặp phải các vấn đề rõ ràng khi nhận kết quả cho Control.Arrow hoặc hướng dẫn loại lớp đơn giản.

-> được gọi là gì và tôi có thể đọc thêm về nó ở đâu?

+2

Lưu ý: Đó phải là 'instance Monad ((->) r)'. '(->)' lấy hai đối số kiểu, trong khi 'Monad' là cho các kiểu chỉ lấy một, do đó bạn cần áp dụng một phần nó trước tiên. – hammar

Trả lời

27

(->) thường được gọi là "chức năng mũi tên" hoặc "loại chức năng xây dựng", và trong khi nó có một số cú pháp đặc biệt, không có rằng nhiều đặc biệt về nó.

Về bản chất, đó là một toán tử kiểu kết xuất. Cung cấp cho nó hai loại và nó cung cấp cho bạn loại chức năng giữa các loại đó. Giống như 2 + 3 là cú pháp đường cho (+) 2 3, vậy là from -> to đường cú pháp cho (->) from to. Bạn có thể nghĩ về nó như Function from to nếu các biểu tượng khó hiểu.

Nói cách khác, ví dụ bạn đề cập có thể được đọc như

instance Monad (Function from) where ... 

mà làm cho nó rõ ràng rằng chúng ta đang nói về các chức năng mà một vài tham số của một số tùy ý (nhưng cố định) gõ. Trên thực tế, bản sao đơn lẻ này được tìm thấy trong Control.Monad.Instances và về bản chất nó giống như the Reader monad.

Nhìn vào the source, nó thực sự khá đơn giản:

instance Monad ((->) r) where 
    return = const 
    f >>= k = \ r -> k (f r) r 

Các giá trị tầm thường do return bỏ qua các đối số, và các nhà điều hành (>>=) phân phối các lập luận r cho cả hai bên. Cũng cần lưu ý rằng trong trường hợp Applicative tương ứng cho các chức năng, pure(<*>) tương ứng với bộ kết hợp K và S của the SKI combinator calculus.

(->) cũng được tổng quát theo Arrow type class. Giới thiệu về các mũi tên can be found here.

Cuối cùng, lưu ý rằng biểu tượng -> cũng xuất hiện trong các phần khác ít hoặc không liên quan của cú pháp, bao gồm trừu tượng lambda \x -> ..., biểu thức dạng chữ hoa case ... of x -> ..., v.v.Biểu tượng đảo ngược <- cũng xuất hiện trong một số ngữ cảnh không liên quan. Đừng nhầm lẫn với những người có mũi tên chức năng.

+1

Câu trả lời hay, như mọi khi. Tuy nhiên, người ta có thể tranh luận rằng -> trong các biểu thức lambda có liên quan nhiều hơn đến toán tử kiểu mà người ta có thể nghĩ. Và, tất nhiên '(\ a -> b) c' là' trường hợp c của a -> b' và ngược lại. – Ingo

0

Tôi nghĩ rằng nó được gọi là mũi tên. Theo "Real World Haskell":

-> chỉ có một ý nghĩa: nó biểu thị một hàm lấy đối số của loại ở bên trái và trả về giá trị của loại ở bên phải.

+1

Đây là chữ ký loại, nhưng OP đang nói về một hàm – amindfv

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