gpt4 book ai didi

haskell - 如何有效地组合haskell模式匹配

转载 作者:行者123 更新时间:2023-12-03 17:16:43 24 4
gpt4 key购买 nike

假设我有一堆类型为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优化器。这是ghc -ddump-simpl -O2的结果(此处为GHC 7.10.1)

composedTogether =
\ (a_aoc :: Action) (eta_B1 :: Int) ->
case a_aoc of _ [Occ=Dead] {
Reset -> Optimization.composedTogether1;
Increment ->
case eta_B1 of _ [Occ=Dead] { GHC.Types.I# x_ayY ->
GHC.Types.I# (GHC.Prim.+# x_ayY 1)
};
Decrement ->
case eta_B1 of _ [Occ=Dead] { GHC.Types.I# x_ayN ->
GHC.Types.I# (GHC.Prim.-# x_ayN 1)
}
}


如您所见,所有内容都已内联。

为此,我必须注释掉您的 optimisedCase。不然我有

composedTogether :: Action -> Int -> Int
composedTogether = optimisedCase

multipleCase :: Action -> Int -> Int
multipleCase = optimisedCase


因为GHC发现了等效版本。

我的建议是:忘记这些微优化,打开 -O2,然后让编译器执行其工作。

话虽如此,也不要高估优化器的功能! :-P确实重要时,检查生成的Core。

关于haskell - 如何有效地组合haskell模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37061690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com