Как я использую константы в haskell, для предотвращения магических чисел?

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

26
задан Don Stewart 20 April 2011 в 04:37
поделиться

3 ответа

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

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

13
ответ дан 28 November 2019 в 06:05
поделиться

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

magicNumber = 42

magicList = [1..magicNumber]
50
ответ дан 28 November 2019 в 06:05
поделиться

Чак и они верны. Есть одна ловушка, о которой вы должны знать:

magicNum = 42

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

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

39
ответ дан 28 November 2019 в 06:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: