(または同等のもの)を持つ関数がたくさんあるとします。Action
は合計型であり、各関数は1つのバリエーションだけで実際に動作します。どのようにhaskellパターンマッチを効率的に組み合わせるか
data Action = Reset | Increment | Decrement
tryReset :: Action -> Int -> Int
tryReset a i = case a of
Reset -> 0
_ -> i
tryIncrement :: Action -> Int -> Int
tryIncrement a i = case a of
Increment -> i + 1
_ -> i
tryDecrement :: Action -> Int -> Int
tryDecrement a i = case a of
Decrement -> i - 1
_ -> i
代わりに、複数のcase式(multipleCase
)の、単一case式(optimisedCase
)が発生する機能(例えば。composedTogether
等)を構成する方法はありますか?
composedTogether :: Action -> Int -> Int
composedTogether a = tryReset a . tryIncrement a . tryDecrement a
optimisedCase :: Action -> Int -> Int
optimisedCase Reset i = 0
optimisedCase Increment i = i + 1
optimisedCase Decrement i = i - 1
multipleCase :: Action -> Int -> Int
multipleCase a i = case a of
Decrement -> i - 1
_ -> case a of
Increment -> i + 1
_ -> case a of
Reset -> 0
_ -> i
これは既に魔法のように自動的に最適化されていますか?
オプティマイザが多すぎることがあります。先日、GHCが私が割り当てをしたくないときに必要としなかった共有を得るためにサンクを割り当てないようにする方法を理解するために、私は1時間以上かかりました! – dfeuer