说我有一个从1到MAGIC_NUMBER的数字列表 - 有没有办法可以事先声明这个?
答案 0 :(得分:48)
不确定。事实上,鉴于Haskell纯粹是功能性的,因此定义常量比非常量更容易。
magicNumber = 42
magicList = [1..magicNumber]
答案 1 :(得分:39)
Chuck和ony的答案都是正确的。你应该注意一个陷阱:
magicNum = 42
f magicNum = 'A'
f _ = 'B'
不是您所期望的 - 第二行中的magicNum
是匹配所有内容的模式,就像f x = 'A'
一样。使用f x | x == magicNum = 'A'
。
答案 2 :(得分: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)]