Скажем, у меня есть куча функций с типом Action -> Int -> Int
(или эквивалентом), где Action
- тип суммы, и каждая функция выполняет реальную работу только с одним из вариантов.Как правильно сочетать шаблоны шаблонов хэселла
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
Есть ли способ, чтобы составить функции (например, как composedTogether
), чтобы привести к выражению одного случая (optimisedCase
), вместо множества примеров выражений (multipleCase
)?
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 уже волшебный и оптимизирует его автоматически?
Иногда оптимизатор делает слишком много! На днях мне потребовалось более часа, чтобы выяснить, как предотвратить GHC от выделения thunk, чтобы получить общий доступ, который мне не нужен, когда я не хотел выделения! – dfeuer