在Haskell中定义一个函数的2个或多个方程可以共享相同的where / let块吗?

让我举一个人为的例子来说明这个问题。

首先,请考虑以下代码作为起点:

someFunction v1 v2 v3 = difference ^ v3
   where
      difference = v1 - v2

到目前为止,这么好。但是,想象一下,我需要处理一个<!>“替代案例<!>”;如果v3 == 99并且差异<!> LT,我需要返回0; 4(完全随意,但让我们说这些是我的要求)。

我的第一个想法就是这样做:

someFunction v1 v2 99 | difference < 4 = 0
someFunction v1 v2 v3 = difference ^ v3
   where
      difference = v1 - v2

然而,这不起作用,因为someFunction的第一个等式和someFunction的第二个等式不是在块中共享相同的。这在这个设计的例子中并不是什么大问题,因为where块中只有一个变量(<!> quot; difference <!> quot;)。但在现实世界中,可能存在大量变量,重复这些变量是不可接受的。

我已经知道如何通过使用警卫并且只有一个等式来解决这个问题。问题是,有多种方法可以让多个方程式共享相同的where / let子句吗?因为似乎希望有多个具有不同模式的方程式而不是被迫只有一个带有许多防护的方程式。

有帮助吗?

解决方案

一个选项是将函数提升到where块本身:

someFunction v1 v2 = f
    where
        f 99 | difference < 4 = 0
        f v3 = difference ^ v3
        difference = v1 - v2

其他提示

我想你不能。可能你最好的解决方案就是:

someFunction v1 v2 v3 | v3==99 && difference<4 = 0
                      | otherwise = difference ^ v3
                      where difference = v1 - v2
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top