2012-04-11 23 views
5

Gần đây tôi đã cố gắng "tìm hiểu cho tôi một Haskell", và tôi muốn tạo một kiểu mới để biểu diễn một trạng thái nguyên, mà không cần sử dụng một số nguyên nguyên (cho loại an toàn và mã rõ ràng). Cụ thể, mã sau đây biên dịch:Tại sao loại Haskell "lấy tích phân" cần phải "phát sinh Enum"?

newtype AuxState = AuxState Integer 
    deriving (Eq, Ord, Num, Integral, Real, Enum) 

Tuy nhiên, vì có vô số trạng thái trong ứng dụng của tôi, tôi không quan tâm đến việc chuyển trạng thái này thành Enum. Tuy nhiên, nếu tôi cố gắng để loại bỏ các tuyên bố deriving (Enum) vì vậy nó chỉ deriving (Eq, Ord, Num, Integral, Real), trình biên dịch phàn nàn:

No instance for (Enum AuxState) 
    arising from the 'deriving' clause of a data type declaration 
Possible fix: 
    add an instance declaration for (Enum AuxState) 
    or use a standalone 'deriving instance' declaration, 
     so you can specify the instance context yourself 
When deriving the instance for (Integral AuxState) 

Tôi thấy khó để tin rằng Haskell buộc một kiểu trong lớp Integral cũng là trong lớp Enum; không phải nó chỉ là một cách khác? Có một lý do cho điều này, hay tôi đang làm/hiểu điều gì sai?

+2

Trường hợp cụ thể là các loại được sắp xếp theo thứ tự — giá trị của chúng có thể được liệt kê. Ưu điểm chính của lớp kiểu Enum là chúng ta có thể sử dụng các giá trị của nó trong các phạm vi danh sách. Họ cũng đã xác định những người thừa kế và người tiền nhiệm, mà chúng tôi có thể nhận được với các cuộc đấu giá succ và trước. Tôi tin rằng tất cả các số nguyên nên thuộc về lớp này, tại sao không phải của bạn? –

+1

"Tuy nhiên, vì có vô số trạng thái trong ứng dụng của tôi, ..." Tôi nghĩ bạn hiểu sai về 'Enum'. 'Enum' không có nghĩa là một loại có số lượng giá trị hữu hạn. – newacct

+1

"không phải nó chỉ là một cách khác?" 'Double' là một' Enum', nhưng rõ ràng không phải là 'Integral' – newacct

Trả lời

8

Tất cả Integral là nhất thiết phải Enum vì nền móng của Integral là các hoạt động succpred. (Về mặt kỹ thuật, Enum đang đứng trong một hệ thống phân cấp kiểu thích hợp, trong đó loại Integral là một semigroup toán học, tôi nghĩ vậy.) Cách khác xung quanh có vẻ sai nhiều hơn: bạn có nghĩa là mỗi Enum phải là Integral? Điều này có bao gồm ADT ngẫu nhiên như

data Foo = A | B | C | D | E | F | G deriving (Enum) 

?

(Mỗi Enum nên đẳng cấu với một tập hợp con của Integral, chắc chắn, nhưng điều đó thực sự gợi ý cho nó đi theo một hướng khác: Integral thể đại diện cho bất kỳ Enum nhưng không phải ngược lại, vì vậy Integral là loại của ur- Enum.)

+0

Tôi sẽ không nói 'Integral' là một semigroup. Đó là loại của một miền Euclide (nghĩa là một loạt các vòng đẹp) nhưng với một số hạn chế thêm. –

6

lý do kỹ thuật là do là vì Integral được định nghĩa trong Prelude như sau:

class (Real a, Enum a) => Integral a where 
    ... 

lý do toán học là tất cả các loại không thể thiếu là đếm được nhưng không có t ngược lại. Hãy suy nghĩ về các con số hợp lý chẳng hạn. Lưu ý rằng Enum không ngụ ý điều tra hữu hạn như được hiển thị bởi Integer.

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