2010-06-27 23 views
23

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?

+1

Ý của bạn là gì bằng cách "khai báo số"? – ony

+0

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. –

Trả lời

13

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)] 

45

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] 
35

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'.

+1

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

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