Trong gói cơ bản với phiên bản> = 4.8.0.0, được bao gồm trong GHC 7.10.1 trở lên, hiện nay là một loại Natural mà làm những gì bạn muốn - bạn chỉ có thể thay đổi mã của bạn để:
import Numeric.Natural (Natural)
func :: [Natural] -> [Int]
Tuy nhiên, gần với Integer
hơn Int
, vì như Integer
và không giống như Int
, nó không có giá trị tối đa.
Vì Natural
, như Integer
, là một thể hiện của Num
và Integral
, tất cả các phép tính số học tương tự và chức năng chuyển đổi có sẵn như bạn nhận được với Integer
. Các nỗ lực tính toán số âm Natural
sẽ ném một số Underflow
vào thời gian chạy, là ArithException
. Ngoài ra, thuận tiện, bạn có thể tạo một Natural
chỉ sử dụng một số nguyên theo nghĩa đen, mà không có một chuyển đổi:
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Prelude> :m +Numeric.Natural
Prelude Numeric.Natural> 2 :: Natural
2
Tuy nhiên, nếu bạn muốn ở lại trong lĩnh vực số nguyên kích thước cố định, có một giải pháp cho điều đó, quá - và nó đã tồn tại lâu hơn - Word
từ the module Data.Word (cũng chứa ví dụ Word8
đối với các số nguyên không âm 8 bit). Bạn sẽ sử dụng Word
theo cách tương tự như Natural
.Tuy nhiên, được cảnh báo - sự Word
loại sẽ âm thầm underflow, mà không cần ném một ngoại lệ:
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Prelude> :m +Data.Word
Prelude Data.Word> 2 :: Word
2
Prelude Data.Word> it - 4
18446744073709551614
Nguồn
2017-11-16 22:34:14
Tôi hy vọng rằng ai đó sẽ hiển thị như thế nào để làm điều này với các loại, nhưng bây giờ tôi có thể thấy rằng đây là điều không thể - từ những nhận xét cho lớp loại NonNegative.C không âm: "Trường hợp của lớp này phải đảm bảo giá trị không âm. Chúng tôi không thể thực thi điều này theo loại, nhưng ràng buộc loại lớp NonNegative.C tránh sử dụng ngẫu nhiên các loại cho phép số âm." Thật thất vọng :-) – liwp