Giả sử tôi có danh sách các số từ 1 đến MAGIC_NUMBER - Có cách nào tôi có thể khai báo trước này không?Làm cách nào để sử dụng các hằng số trong haskell, để tránh các số ma thuật?
Trả lời
Bạn có thể sử dụng dữ liệu đại số trong tất cả các tính toán của bạn và sử dụng một số giá trị tên là nếu họ có thực sự "kỳ diệu", hoặc xây dựng làm cho các giá trị đại số để "ma thuật" số và nhiều hơn nữa:
class FlagsMask f where mask :: f -> Int
data Magics = Alpha | Beta | Gamma
deriving (Enum, Read, Show, Eq, Ord)
instance FlagsMask Magics where
mask m = 2^fromEnum m
data PermsFlag = FlagRead | FlagWrite | FlagExec | FlagSuper
-- [flagRead, flagWrite, flagExec] = [2^n | n <- [0..2]]
(flagRead : flagWrite : flagExec : _) = [2^n | n <- [0..]]
flagSuper = 16
instance FlagsMask PermsFlag where
mask FlagRead = flagRead
mask FlagWrite = flagWrite
mask FlagExec = flagExec
mask FlagSuper = flagSuper
*Main> map fromEnum [Alpha .. ] [0,1,2] it :: [Int] *Main> zip [Alpha .. ] [1..] [(Alpha,1),(Beta,2),(Gamma,3)] it :: [(Magics, Integer)]
Chắc chắn. Trong thực tế, cho rằng Haskell là hoàn toàn chức năng, nó dễ dàng hơn nhiều để xác định một hằng số không phải là một hằng số.
magicNumber = 42
magicList = [1..magicNumber]
Câu trả lời của Chuck và ony là chính xác. Có một cái bẫy bạn cần phải nhận thức:
magicNum = 42
f magicNum = 'A'
f _ = 'B'
là KHÔNG những gì bạn có thể mong đợi - magicNum
trong dòng thứ hai là một mô hình phù hợp với tất cả mọi thứ, giống như f x = 'A'
. Sử dụng f x | x == magicNum = 'A'
.
Trong thực tế, bạn thậm chí có thể rebind các nhà khai thác tiêu chuẩn theo cách này. Ví dụ, nếu bạn định nghĩa hàm 'f (==) a b = a == b', và sau đó gọi' f div 8 4', kết quả sẽ là 2, không sai. (Tất nhiên, đây là một loại bệnh lý cần làm.) – Chuck
- 1. Tránh các số ma thuật mà không tạo phụ thuộc
- 2. Tránh sử dụng các số ma thuật trong JavaScript - các lựa chọn thay thế hoạt động với JsHint
- 3. Tránh các lỗi số CheckStyle ma thuật trong các truy vấn JDBC
- 4. Thực hành tốt nhất cho các hằng số toàn cầu liên quan đến các số ma thuật
- 5. Số ma thuật tăng :: hash_combine
- 6. Làm cách nào để sử dụng các hằng số từ mô-đun Perl?
- 7. Số ma thuật trong mảng? - C++
- 8. Làm thế nào để tránh các tham số?
- 9. Định lượng hằng số Haskell chi tiết
- 10. Khi nào và cách sử dụng hằng số trong PHP?
- 11. Lớp PHP chỉ chứa các hằng số
- 12. Làm cách nào để nhập các hằng số vào nhiều mô-đun trong Perl?
- 13. Làm cách nào để xác định các hằng số trong một tệp riêng biệt trong Perl?
- 14. Làm thế nào để quản lý các hằng số dự án trong một dự án bằng cách sử dụng C#?
- 15. Các hằng số ghi đè trong Java
- 16. Net - Chiến lược để tránh ma thuật chuỗi
- 17. Làm cách nào để tạo các hằng số lớp riêng trong Ruby
- 18. Trong Java, làm cách nào để lặp lại các hằng số của một giao diện?
- 19. Làm cách nào để kiểm tra các hằng số được xác định trong PHP?
- 20. Làm thế nào để chia sẻ các hằng số giữa Interface Builder và mã?
- 21. Tại sao Phobos sử dụng enum cho các hằng số?
- 22. Sử dụng hằng số Scala trong Java
- 23. Làm cách nào để lấy tên của hằng số?
- 24. Làm cách nào để khai báo hằng số Int64?
- 25. Làm thế nào để dự đoán thủy triều bằng cách sử dụng hằng số hài hòa
- 26. Sử dụng các hằng số làm chỉ mục cho các mảng kết hợp Javascript
- 27. Làm cách nào để tránh sử dụng tham số ngoài trong khối phương thức ẩn danh?
- 28. Làm thế nào để xác định một hằng số bằng cách sử dụng một số khác trong một lớp Matlab
- 29. Làm cách nào để chọn số ma thuật tốt cho định dạng tệp của tôi?
- 30. Sử dụng biến lớp làm hằng số trong Scala
Ý của bạn là gì bằng cách "khai báo số"? – ony
Một điểm rất quan trọng bạn nên làm rõ: khi nào bạn biết số ma thuật? Nếu bạn biết nó tại thời gian biên dịch thì Chuck có câu trả lời đúng bên dưới. –