2017-07-03 22 views
10

Trong Java, chúng ta có thể tạo các đối tượng/thể hiện từ các lớp. Trong Haskell chúng ta có thể làm cho các trường hợp từ kiểu lớp học, ví dụ:Ví dụ có ý nghĩa gì trong Haskell?

data ShirtSize = S | M | L  -- Here ShirtSize is a enum data-type 

class MyEq a where 
    (==) :: a -> a -> Bool 
instance MyEq ShirtSize where -- Here ShirtSize is an instance of the MyEq type-class 
    S == S = True 
    M == M = True 
    L == L = True 
    _ == _ = False 

Đây không phải là cùng một câu hỏi như: confused about function as instance of functor in haskell Obs: Tôi không yêu cầu cách thức hoạt động fmap, tôi yêu cầu những gì decleration dụ nghĩa trong Haskell .

Câu hỏi của tôi là: Ví dụ có ý nghĩa gì trong haskell? Trong java chúng ta có thể tạo các thể hiện từ các lớp, nhưng trong haskell có vẻ như các thể hiện là các kiểu (như ShirtSize) mà bạn có thể áp dụng các hàm kiểu lớp trên (ví dụ: hàm (==) từ MyEq). Tôi có đúng không? và cũng là một ví dụ trong Haskell so với một thể hiện/đối tượng trong Java là gì?

+12

Nó giống như "thực hiện Giao diện" trong Java. – Bergi

+3

Tôi nghĩ rằng bạn đóng đinh nó với "trường hợp là các loại (như ShirtSize) mà bạn có thể áp dụng các chức năng kiểu lớp trên (ví dụ: (==) chức năng từ MyEq)." Hầu như mọi phòng đều để lại câu trả lời sau đó. Có sự nhầm lẫn nào nữa mà chúng tôi có thể nhận xét khi chúng tôi phản hồi không? –

+0

Đọc phần Typeclasses 102 từ http://learnyouahaskell.com/making-our-own-types-and-typeclasses cho một mô tả thực sự tốt, tôi nghĩ rằng –

Trả lời

12

Trong Java, hệ thống lớp học là một cách để nhóm đối tượng tương tự. Một thể hiện của một lớp là một đối tượng riêng lẻ thuộc về lớp đó.

Trong Haskell, hệ thống lớp học (nói gần) một cách để nhóm tương tự loại. (Đây là lý do chúng tôi gọi chúng là "loại lớp"). Một phiên bản của một lớp là một cá nhân loại thuộc về lớp đó. (Có nghĩa là, cho đến khi bạn bắt đầu xem xét các loại lớp đa dạng).

Ngẫu nhiên, một lớp Haskell (đơn lớp) hơi giống với giao diện Java và mở rộng, một lớp Java. Hoặc có lẽ một cá thể Haskell giống với lớp Java. Tốt hơn nên xem đây là trùng hợp ngẫu nhiên. Tiếp cận thuật ngữ giữ nguyên nguồn gốc toán học của nó. Một lớp học chỉ là một đống những thứ thuộc về nhau, và một thể hiện là một trong những thứ này.

5

Nếu bạn quan tâm đến việc giải thích về các loại lớp và sự khác biệt từ giao diện Java, bạn nên đọc this post by <❤>. Nó cũng giải thích các trường hợp là tốt.

Đối với tôi, tôi xem số instancekết nối giữa loại dữ liệu và giao diện. data chứa một số thông tin, class chứa các phương pháp. data là khoảng dữ liệu (xin lỗi vì tautology) và class là khoảng hành vi. Khi bạn nhìn vào kiểu dữ liệu bạn không thấy những gì bạn có thể làm với nó, thay vào đó bạn sẽ thấy những gì nó lưu trữ. Khi bạn nhìn vào số class bạn thấy loại nào sẽ có thể thực hiện được, bạn không quan tâm những gì nó lưu trữ trong nội bộ. Trong lập trình thực sự bạn thực sự quan tâm đến các chi tiết của việc triển khai và cách các phương thức được triển khai bằng cách sử dụng dữ liệu cụ thể. Vì vậy, instance chỉ cho bạn thấy mối quan hệ giữa một số dữ liệu và một số hành vi - cách hành vi này được triển khai bằng cách sử dụng dữ liệu đã cho.

Trong trường hợp bạn có nhiều quan tâm đến mô hình lớp học kiểu sau đó đọc bài viết trên blog này: http://www.haskellforall.com/2012/05/scrap-your-type-classes.html

Bạn có thể nhìn vào trường hợp như một giá trị! Nó có thể thổi tâm trí của bạn nếu bạn phải đối mặt với định nghĩa như vậy lần đầu tiên.

Trong một số ngôn ngữ loại phụ thuộc instances thực sự là giá trị mà bạn có thể chuyển cho các chức năng khác. Hãy nhìn vào câu hỏi này:

In Idris, is "Eq a" a type, and can I supply a value for it?

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