2010-06-27 3 views
23

Скажите, что у меня есть список чисел от 1 до MAGIC_NUMBER. Есть ли способ, которым я могу объявить это заранее?Как использовать константы в haskell, чтобы избежать магических чисел?

+1

Что вы подразумеваете под «объявлением номеров»? – ony

+0

Очень важный момент, который вы должны уточнить: когда вы знаете магическое число? Если вы знаете это во время компиляции, то у Чака есть правильный ответ ниже. –

ответ

13

Вы можете использовать алгебраические данные во всех своих расчетах и ​​использовать некоторые именованные значения, если они действительно «магия», или строить рендер алгебраических значений в «магические» числа и многое другое:

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

Несомненно. На самом деле, учитывая, что Haskell является чисто функциональным, намного легче определить константу, чем непостоянную.

magicNumber = 42 

magicList = [1..magicNumber] 
35

Ответы Чака и Они правильные. Там одна ловушка вы должны знать:

magicNum = 42 

f magicNum = 'A' 
f _ = 'B' 

это не то, что вы могли бы ожидать - magicNum во второй строке модель, которая соответствует всем, так же, как f x = 'A'. Используйте f x | x == magicNum = 'A'.

+1

На самом деле вы можете даже переустановить стандартные операторы таким образом. Например, если вы определите функцию 'f (==) a b = a == b', а затем вызовите' f div 8 4', результат будет равен 2, а не false. (Это, конечно, своего рода патологическая вещь). – Chuck

Смежные вопросы