2010-04-20 47 views
49

tôi không thể tìm ra những gì "| m -> w" -part nghĩa trong một định nghĩa lớp như thế này:"|" là gì? cho một định nghĩa lớp Haskell?

class (Monoid w, Monad m) => MonadWriter w m | m -> w 

gì thông tin bổ sung thực hiện điều này thêm vào các định nghĩa lớp học?

Trả lời

41

Thanh dọc là bộ tách cú pháp không có ý nghĩa, được sử dụng để introduce functional dependencies trên lớp loại nhiều tham số, do đó, kỹ thuật | có nghĩa là không có gì. Có lẽ | được chọn làm tương tự trực quan cho việc sử dụng cùng một biểu tượng cho pattern guards trên các hàm.

Theo như sự phụ thuộc chức năng tự đi, chỉ cần đọc x -> y là "kiểu tham số x duy nhất xác định loại hình tham số y", nghĩa là biết x một mình là đủ để tìm ra ví dụ chính xác. Có thêm các biến chứng, đặc biệt là với các phần mở rộng GHC khác được kích hoạt, nhưng hầu hết thời gian bạn không cần phải lo lắng về chúng.

Ngược lại, không phụ thuộc chức năng, việc chọn một thể hiện của một loại kiểu đa tham số yêu cầu phải biết tất cả các tham số kiểu. Một ví dụ điển hình có một tham số là một loại vùng chứa và một tham số thứ hai là loại phần tử chứa; các hàm như "concatenate" hoặc "isEmpty" không cần đề cập đến loại phần tử, chỉ loại vùng chứa và do đó sẽ không rõ ràng.

Ngoài ra, nếu bạn đang viết các lớp loại của riêng mình, hãy xem xét thay vì sử dụng type families, đây là một cách tiếp cận mới mà cuối cùng có thể thay thế các phụ thuộc chức năng. Nói chung, các gia đình nhập cho phép bạn viết các định nghĩa loại bị quá tải bên trong một cá thể, không chỉ các hàm bị quá tải.

+0

Câu trả lời hay, cảm ơn bạn rất nhiều! Liên kết đẹp quá! Hãy nhìn vào điều gia đình đó một khi tôi đã hoàn thành việc tìm ra cách những Monad Transformers hoạt động ... – martingw

+1

@martingw: Nếu bạn hỏi tôi, loại gia đình là * nhiều * dễ chịu hơn máy biến áp monad, mà có vẻ như một hack xấu xí, mặc dù một cái hữu ích. Mặc dù nếu bạn muốn, có một gói 'monads-tf' thực hiện các máy biến áp tiêu chuẩn với các họ kiểu thay vì các phụ thuộc chức năng: http://hackage.haskell.org/package/monads-tf –

+0

Các phụ thuộc chức năng cũng cho phép các kiểu phương thức lớp chỉ đề cập đến các biến lớp đủ để xác định tất cả chúng. Đó là * có khả năng * rằng Richard Eisenberg cuối cùng có thể kết thúc việc thực hiện lại các loại hình gia đình về các quỹ đạo và các chuỗi mẫu; điều đó có thể rất thú vị, mặc dù nó có thể gây khó khăn cho một số sử dụng ưa thích của Edward Kmett của các loại gia đình bị mắc kẹt. – dfeuer

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