如何在haskell中使用常量来避免幻数?

aga*_*gam 26 haskell constants

假设我有一个从1到MAGIC_NUMBER的数字列表 - 有没有办法可以事先声明这个?

Chu*_*uck 50

当然.事实上,鉴于Haskell纯粹是功能性的,定义常量比非常量更容易.

magicNumber = 42

magicList = [1..magicNumber]
Run Code Online (Sandbox Code Playgroud)


sdc*_*vvc 39

Chuck和ony的答案是正确的.你应该注意一个陷阱:

magicNum = 42

f magicNum = 'A'
f _ = 'B'
Run Code Online (Sandbox Code Playgroud)

不是你所期望的 - magicNum在第二行是一个匹配所有东西的模式,就像f x = 'A'.使用f x | x == magicNum = 'A'.


ony*_*ony 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
Run Code Online (Sandbox Code Playgroud)
*Main> map fromEnum [Alpha .. ]
[0,1,2]
it :: [Int]
*Main> zip [Alpha .. ] [1..]
[(Alpha,1),(Beta,2),(Gamma,3)]
it :: [(Magics, Integer)]