Скажем, у меня есть список чисел от 1 до MAGIC_NUMBER. Есть ли способ, чтобы я мог заранее объявить это?
Как использовать константы в haskell, чтобы избежать магических чисел?
Ответ 1
Конечно. Фактически, учитывая, что Haskell является чисто функциональным, гораздо легче определить константу, чем непостоянную.
magicNumber = 42
magicList = [1..magicNumber]
Ответ 2
Ответы Чака и Они правильны. Там одна ловушка, о которой вы должны знать:
magicNum = 42
f magicNum = 'A'
f _ = 'B'
НЕ является тем, что вы можете ожидать - magicNum
во второй строке - это шаблон, соответствующий всем, как f x = 'A'
. Используйте f x | x == magicNum = 'A'
.
Ответ 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)]