web-dev-qa-db-ja.com

マジックナンバーを避けるために、haskellで定数を使用するにはどうすればよいですか?

1からMAGIC_NUMBERまでの番号のリストがあるとしましょう-これを事前に宣言する方法はありますか?

28
agam

承知しました。実際、Haskellが純粋に機能的であることを考えると、定数を定義する方が非定数よりもはるかに簡単です。

magicNumber = 42

magicList = [1..magicNumber]
48
Chuck

チャックとオニーの答えは正しいです。注意すべきトラップが1つあります。

magicNum = 42

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

期待するものではありません-2行目のmagicNumは、f x = 'A'と同様に、すべてに一致するパターンです。 f x | x == magicNum = 'A'を使用します。

39
sdcvvc

すべての計算で代数的データを使用し、それらが本当に「魔法」である場合はいくつかの名前付き値を使用するか、代数的値を「魔法」の数値などにレンダリングすることができます。

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