2010-08-16 26 views
10

Tôi đã đọc một số excellent introduction to monads for Clojure programmers. Bài viết minh họa rằng bản sắc Identity có chức năng tương đương với số của Clojure để cho và rằng trình tự Danh sách/Danh sách tương đương với cho.Sử dụng cho danh tính đơn lẻ trong Clojure

Khi bài viết được chuyển đến máy biến áp đơn nguyên, nó hiển thị ví dụ kết hợp các trình đơn Có thể và chuỗi. Ok, vì vậy một lý do để sử dụng đơn nguyên Sequence thay vì cho là tôi có thể chuyển đổi nó. Tuy nhiên, việc chuyển đổi một đơn nguyên danh tính không có ý nghĩa với tôi - điều đó không phải lúc nào cũng tương đương với việc xây dựng bất cứ đơn nguyên biến đổi nào không? Ví dụ, nếu tôi chuyển đổi Có thể với danh tính - không phải là chỉ cho tôi một Có lẽ, mà sẽ dễ dàng hơn để khai báo trực tiếp?

Có thể ai đó rõ ràng lên cho dù có một thực tế sử dụng trong Clojure cho việc lựa chọn một đơn nguyên danh tính trên một hãy (có lẽ tôi không nghĩ đến tất cả các cách thức thông qua những tác động của biến?), Hoặc là nó chỉ có cho lý thuyết đầy đủ?

Trả lời

7

Một lý do chính đáng là bạn có thể viết các hàm đơn điệu không được gắn với một đơn lẻ cụ thể và sau đó thực hiện chúng trong khối with-monad. identity-m cung cấp cho bạn tùy chọn không liên quan đến bất kỳ voodoo monadic đặc biệt nào nếu bạn viết (with-monad identity-m ...).

(Rõ ràng, điều này sẽ không hoạt động nếu chức năng monadic của bạn sử dụng thiết yếu một số thuộc tính của đơn nguyên hoạt động của nó, như khả năng khởi động và thiết lập cho trạng thái, vv Không phải tất cả các chức năng đơn điệu đều như thế này, tuy nhiên.)

8

Thật vậy, đơn vị danh tính rất hữu ích làm cơ sở trong một máy biến áp đơn nguyên. Ví dụ máy biến áp có lẽ đơn nguyên (có thể-t) cho phép một giá trị không có gì khác hơn là con số không:

1:2 => (use 'clojure.contrib.monads) 
nil 
1:3 => (domonad maybe-m [a 1 b 2] (+ a b)) 
3 
1:4 => (domonad maybe-m [a 1 b nil] (+ a b)) 
nil 
;; Domain uses the :fail keyword as the nil value: 
1:6 => (domonad (maybe-t identity-m :fail) [a 1 b :fail] (+ a b)) 
:fail 

Lưu ý rằng việc sử dụng có lẽ m là đơn nguyên cơ sở sẽ tắt trên cả hai: thất bại và nil, thay vì chỉ: Thất bại.

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