最近我制作了一个程序,我使用了以下形式的数据类型:
data MyType = Constructor1 | Constructor2 deriving Eq
是的,这种类型与Bool
几乎相同我只是将它命名为不同的东西,以使我的代码更具可读性。在程序的后期,我有
myFunc input = if input == Constructor1 then --do something
else --do something else
我认为这可能是一个坏主意的原因是,如果它被解释为它的方式,每次程序遇到这个分支时,它必须通过==
函数运行它设置为MyType
以使Bool
传递给if_then_else_
函数,而如果我刚使用Bool
则==
函数的必要性被消除这会加快这个过程。
我应该用MyType
的实例替换Bool
的所有实例,还是ghc以某种方式优化使用这些数据类型?
答案 0 :(得分:8)
不,不要用Bool
替换它;而是用模式匹配替换你的等式检查。
myFunc Constructor1 = -- do something
myFunc Constructor2 = -- do something else
答案 1 :(得分:2)
丹尼尔方法的一些替代方案(无论如何,这是最好的方法)。
使用case .. of
myFunc input = case input of
Constructor1 -> ...
Constructor2 -> ...
滚动你的自定义if
(Haskell擅长于此!)
-- define this helper once
myIf :: MyType -> a -> a -> a
myIf Constructor1 x1 _ = x1
myIf Constructor2 _ x2 = x2
-- use it as many times as needed
myFunc input = myIf input
(...) -- "then"/Constructor1 branch
(...) -- "else"/Constructor2 branch