(->)
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
và (<*>)
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.
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