Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何改进有两种情况的haskell代码?_Performance_Haskell - Fatal编程技术网

Performance 如何改进有两种情况的haskell代码?

Performance 如何改进有两种情况的haskell代码?,performance,haskell,Performance,Haskell,我正在学习Haskell,我觉得我的代码乱七八糟。这是: fold (Add (e1) (e2)) = case e11 of N n -> case e22 of N m -> N (n + m); _ -> Add e11 e22 _ -> Add e11 e22 where e11 = fold e1 e22 = fold e2 N和Add是我定义的数据类型。问题是,我不喜

我正在学习Haskell,我觉得我的代码乱七八糟。这是:

fold (Add (e1) (e2)) = case e11 of N n -> case e22 of N m -> N (n + m); _ -> Add e11 e22
                                   _ -> Add e11 e22
  where 
    e11 = fold e1
    e22 = fold e2

N和Add是我定义的数据类型。问题是,我不喜欢我使用两个箱子的方式,所以有没有一种方法可以做到相同但更干净?

在我看来,如果你在一对带有两个
折叠的鞋子上进行图案匹配,会简单得多:

fold (Add e1 e2) = case (fold e1, fold e2) of
   (N n, N m) -> N (n+m)
   (e11, e22) -> Add e11 e22
如果两者的结果都是
N…
形式,则对它们求和,否则对结果使用
Add


性能应该与原始代码中的性能基本相同。甚至有可能两个版本在优化后生成相同的核心。

不知道可以使用元组,我假设可以对n元组执行相同的操作,对吗?