2012-05-03 22 views
28

Trong the chain documentation bạn tìm thấy:Chức năng chuỗi trong underscore.js có tạo ra một đơn nguyên không?

Calling chain trên một đối tượng bao bọc sẽ gây ra tất cả các phương pháp tương lai gọi để trở về đối tượng bọc là tốt. Khi bạn đã hoàn thành việc tính toán , hãy sử dụng value để truy xuất giá trị cuối cùng.

Vì vậy, chức năng chain có tạo một đơn nguyên không?

+3

Tôi đã gắn thẻ haskell này, bởi vì người bán hàng có thể có điều gì đó để nói về chủ đề này. – Marcin

Trả lời

38

Không, không phải là một đơn nguyên, mà là một comonad! Nó biến một hàm nhận một đối tượng được bao bọc và trả về một giá trị bình thường thành một hàm mà cả hai đều lấy và trả về một đối tượng được bao bọc. Là một loại chữ ký Haskell đó sẽ là:

(Wrapped a -> b) -> (Wrapped a -> Wrapped b) 

Các loại chữ ký của value là:

Wrapped a -> a 

Đây là chính xác những gì bạn cần cho một comonad. Hàm đầu tiên thường được gọi là extend và hàm thứ hai extract.

Bạn có thể nghĩ một comonad là một giá trị với một số ngữ cảnh bổ sung. Và đó là tất nhiên chính xác những gì chain nào.

Xem this Stackoverflow question để biết thêm về tình trạng hôn mê.

+8

Tôi thích câu trả lời này; Tôi nghĩ rằng nó sẽ là rõ ràng hơn ngay lập tức những gì bạn có nghĩa là nếu bạn đã giải thích việc lập bản đồ của phương pháp đối tượng gạch dưới lên các loại. Nếu tôi hiểu một cách chính xác, các phương thức thường là 'Wrapped a -> b' nhưng 'chuỗi' trả về một đối tượng có phương thức (ngoại trừ' giá trị') là tất cả 'Wrapped a -> Wrapped b's. Tôi biết một chút Haskell, nhưng câu hỏi ban đầu không được gắn thẻ Haskell để giải thích về cách các bản đồ trả lời của bạn vào thư viện JS có thể hữu ích. – ellisbben