在Haskell中使用自定义二进制数据类型是一个坏主意吗?

时间:2017-09-22 04:58:14

标签: haskell ghc

最近我制作了一个程序,我使用了以下形式的数据类型:

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以某种方式优化使用这些数据类型?

2 个答案:

答案 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