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?
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? –
"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
"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