Tôi thích nghĩ về Mũi tên, như Monads và Functor, khi cho phép lập trình viên thực hiện các tác phẩm kỳ lạ của các hàm.
Không có Monads hoặc Mũi tên (và Functor), thành phần các chức năng trong ngôn ngữ chức năng bị giới hạn trong việc áp dụng một chức năng cho kết quả của chức năng khác. Với monad và functor, bạn có thể xác định hai hàm và sau đó viết mã có thể sử dụng lại riêng biệt, xác định cách các hàm đó, trong ngữ cảnh của đơn nguyên cụ thể, tương tác với nhau và với dữ liệu được truyền vào chúng. Mã này được đặt trong mã liên kết của Monad. Vì vậy, một đơn nguyên là một chế độ xem, chỉ là một thùng chứa cho mã liên kết có thể sử dụng lại. Các chức năng sáng tác khác nhau trong bối cảnh của một đơn vị từ một đơn vị khác.
Một ví dụ đơn giản là đơn vị Có thể, trong đó có mã trong hàm liên kết sao cho nếu một hàm A được tạo với hàm B trong một đơn vị Có thể và B tạo ra Không có gì, thì mã liên kết sẽ đảm bảo rằng thành phần của hai hàm tạo ra Không có gì, mà không cần áp dụng A cho giá trị Không có gì từ B. Nếu không có đơn vị, lập trình viên sẽ phải viết mã vào A để kiểm tra đầu vào Không có gì.
Monads cũng có nghĩa là lập trình viên không cần phải nhập rõ ràng các tham số mà mỗi hàm yêu cầu vào mã nguồn - hàm liên kết xử lý việc truyền tham số. Vì vậy, bằng cách sử dụng các đơn vị, mã nguồn có thể bắt đầu trông giống như một chuỗi các tên hàm tĩnh, thay vì trông giống như hàm A "gọi" hàm B với các tham số C và D - mã bắt đầu giống như một mạch điện tử hơn là máy di chuyển - nhiều chức năng hơn bắt buộc.
Mũi tên cũng kết nối các chức năng với nhau bằng chức năng liên kết, cung cấp chức năng có thể sử dụng lại và ẩn các tham số. Nhưng chính Mũi tên có thể được kết nối với nhau và được soạn thảo và có thể tùy ý định tuyến dữ liệu đến các Mũi tên khác khi chạy. Bây giờ bạn có thể áp dụng dữ liệu cho hai đường dẫn của Mũi tên, "làm những việc khác nhau" cho dữ liệu và lắp lại kết quả. Hoặc bạn có thể chọn nhánh Mũi tên nào để truyền dữ liệu, tùy thuộc vào một số giá trị trong dữ liệu. Mã kết quả thậm chí giống như một mạch điện tử, với các công tắc, độ trễ, tích hợp, vv Chương trình trông rất tĩnh và bạn không thể thấy nhiều thao tác dữ liệu đang diễn ra. Có ngày càng ít tham số để suy nghĩ và ít cần suy nghĩ về những tham số giá trị nào có thể hoặc không thể thực hiện.
Viết chương trình Arrowized chủ yếu liên quan đến việc chọn ra các mũi tên như bộ chia, công tắc, độ trễ và bộ tích hợp, nâng các chức năng vào các Mũi tên đó và kết nối các Mũi tên với nhau để tạo thành Mũi tên lớn hơn. Trong Lập trình phản ứng chức năng mũi tên, Mũi tên tạo thành một vòng lặp, với đầu vào từ thế giới được kết hợp với đầu ra từ lần lặp cuối cùng của chương trình, để đầu ra phản ứng với đầu vào trong thế giới thực.
Một trong những giá trị thế giới thực là thời gian. Trong Yampa, Mũi tên Chức năng Tín hiệu vô hình xâu chuỗi tham số thời gian thông qua chương trình máy tính - bạn không bao giờ truy cập giá trị thời gian, nhưng nếu bạn kết nối một mũi tên tích hợp vào chương trình, nó sẽ xuất các giá trị được tích hợp theo thời gian mà bạn có thể sử dụng để chuyển đến mũi tên khác.