2010-06-27 8 views
23

Supongamos que tengo una lista de números del 1 al MAGIC_NUMBER - ¿Hay alguna manera de declarar esto de antemano?¿Cómo uso constantes en haskell para evitar números mágicos?

+1

¿Qué quiere decir con "declarar números"? – ony

+0

Un punto muy importante que debes aclarar: ¿cuándo conoces el número mágico? Si lo sabe en tiempo de compilación, entonces Chuck tiene la respuesta correcta a continuación. –

Respuesta

13

Puede utilizar los datos algebraicos en todos sus cálculos y el uso de algunos valores con nombre si son realmente "mágica", o construir render de los valores algebraicos a los números "mágicos" y muchos más:

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

45

Claro. De hecho, dado que Haskell es puramente funcional, es mucho más fácil definir una constante que una no constante.

magicNumber = 42 

magicList = [1..magicNumber] 
35

Las respuestas de Chuck y ony son correctas. Hay una trampa en la que debe tener en cuenta:

magicNum = 42 

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

no es lo que se podría esperar - magicNum en segunda línea es un patrón que coincida con todo, al igual que f x = 'A'. Use f x | x == magicNum = 'A'.

+1

De hecho, incluso puede volver a enlazar operadores estándar de esta manera. Por ejemplo, si define la función 'f (==) a b = a == b', y luego llama a' f div 8 4', el resultado será 2, no falso. (Esto es, por supuesto, una especie de cosa patológica que hacer). – Chuck

Cuestiones relacionadas