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



最近我制作了一个程序,其中使用了以下表格的数据类型:

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,则消除了==功能的必要性,这将加快过程。

我应该用Bool的实例替换MyType的所有实例,还是GHC优化了此类数据类型的使用?

否,不要用 Bool替换它;而是用模式匹配代替您的平等检查。

myFunc Constructor1 = -- do something
myFunc Constructor2 = -- do something else

丹尼尔方法的一些替代方法(无论如何,这是最好的)。

  • 使用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
    

相关内容

  • 没有找到相关文章

最新更新