Скажите, что у меня есть список чисел от 1 до MAGIC_NUMBER. Есть ли способ, которым я могу объявить это заранее?Как использовать константы в haskell, чтобы избежать магических чисел?
ответ
Вы можете использовать алгебраические данные во всех своих расчетах и использовать некоторые именованные значения, если они действительно «магия», или строить рендер алгебраических значений в «магические» числа и многое другое:
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)]
Несомненно. На самом деле, учитывая, что Haskell является чисто функциональным, намного легче определить константу, чем непостоянную.
magicNumber = 42
magicList = [1..magicNumber]
Ответы Чака и Они правильные. Там одна ловушка вы должны знать:
magicNum = 42
f magicNum = 'A'
f _ = 'B'
это не то, что вы могли бы ожидать - magicNum
во второй строке модель, которая соответствует всем, так же, как f x = 'A'
. Используйте f x | x == magicNum = 'A'
.
На самом деле вы можете даже переустановить стандартные операторы таким образом. Например, если вы определите функцию 'f (==) a b = a == b', а затем вызовите' f div 8 4', результат будет равен 2, а не false. (Это, конечно, своего рода патологическая вещь). – Chuck
- 1. Как избежать магических чисел?
- 2. Как избежать магических чисел при сопоставлении event.keyCode в javascript
- 3. Избегание магических чисел в Phaser.io
- 4. Что использовать вместо магических чисел в C
- 5. Как избежать как глобальных переменных, так и магических чисел?
- 6. В C++ лучше использовать #define или const, чтобы избежать магических чисел?
- 7. Избавление от «магических» чисел в SQL Server
- 8. Haskell шаблону - как использовать константы переменной
- 9. Избегание магических строк и чисел
- 10. Как избежать магических строк (PHP MVC Frameworks)
- 11. Как избавиться от магических чисел в Java
- 12. Централизовать div, без магических чисел
- 13. Необходимость объяснения некоторых магических чисел
- 14. Как избавиться от фона магических чисел
- 15. SQL: избегая жесткого кодирования или магических чисел
- 16. Поиск магических чисел с использованием NDepend
- 17. магических чисел в Linux перезагрузки() системного вызова
- 18. Избегание магических чисел без создания зависимостей
- 19. Haskell - Использование константы в шаблону
- 20. Использование менее css consts, чтобы избежать ручных магических констант - всегда или только в простых случаях?
- 21. Значения справочной таблицы в войне против магических чисел
- 22. Работа с IComparable.Compare без магических чисел
- 23. Константы времени компиляции GHC Haskell
- 24. Потеря магических чисел в спецификаторах формата printf в формате Java
- 25. Как избежать проверки пустого значения в Haskell?
- 26. Объяснение чисел в Haskell
- 27. Haskell Как использовать карту, чтобы вернуть список?
- 28. «Константы» в Haskell после запуска программы
- 29. Константы в Haskell и соответствие шаблону
- 30. генератора псевдослучайных чисел в Haskell
Что вы подразумеваете под «объявлением номеров»? – ony
Очень важный момент, который вы должны уточнить: когда вы знаете магическое число? Если вы знаете это во время компиляции, то у Чака есть правильный ответ ниже. –