6

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

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

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

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

到目前为止,一切都很好。但是,假设我需要处理“另一种情况”,如果 v3 == 99 并且差异 < 4(完全任意,但假设这些是我的要求),我需要返回零。

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

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

但是,这是行不通的,因为 someFunction 的第一个方程和 someFunction 的第二个方程并不共享相同的 where 块。在这个人为的示例中,这没什么大不了的,因为 where 块中只有一个变量(“差异”)。但在现实世界的情况下,可能存在大量变量,重复它们是不可接受的。

我已经知道如何通过使用守卫并且只有一个方程来解决这个问题。问题是,有没有办法让多个方程共享相同的 where / let 子句?因为有多个具有不同模式的方程似乎是可取的,而不是被迫只有一个方程有很多守卫。

4

2 回答 2

13

一种选择是将函数提升到 where 块本身:

someFunction v1 v2 = f
    where
        f 99 | difference < 4 = 0
        f v3 = difference ^ v3
        difference = v1 - v2
于 2009-05-06T04:21:50.987 回答
0

我认为你不能。可能您最好的解决方案是:

someFunction v1 v2 v3 | v3==99 && difference<4 = 0
                      | otherwise = difference ^ v3
                      where difference = v1 - v2
于 2009-05-06T04:36:53.867 回答