最近我制作了一个程序,其中使用了以下表格的数据类型:
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