2010-06-27 14 views

cevap

13

ile "sihirli" sayılar cebirsel değerlerin işlemek ve tüm hesaplamalarda cebirsel verileri kullanmak ve onlar gerçekten "sihirli" ise bazı değerleri adlı kullanabilir veya oluşturabilir daha birçok:

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

Elbette. Aslında, Haskell'in tamamen işlevsel olduğu göz önüne alındığında, sabit olmayan bir sabitden daha fazla tanımlamak daha kolaydır.

magicNumber = 42 

magicList = [1..magicNumber] 
35

Chuck's ve ofy'in yanıtları doğru. İkinci satırda magicNum sadece f x = 'A' gibi, her şeyi eşleşen bir desen olan -

magicNum = 42 

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

ne beklediğiniz DEĞİLDİR: bilmeniz gereken bir tuzak var. f x | x == magicNum = 'A' kullanın.

+1

Aslında, standart operatörleri bu şekilde yeniden isimlendirebilirsiniz. Örneğin, 'f (==) a b = a == b' işlevini tanımlarsanız ve' f div 8 4' işlevini çağırırsanız, sonuç 2 olur, false olmaz. (Tabii ki, yapılacak bir patolojik şeydir.) – Chuck

İlgili konular