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

标签 haskell functional-programming pattern-matching

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

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

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

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 block 。在这个人为的示例中,这没什么大不了的,因为 where block 中只有一个变量(“差异”)。但在现实世界的情况下,可能存在大量变量,重复它们是 Not Acceptable 。

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

最佳答案

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

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

关于haskell - 在 Haskell 中定义一个函数的 2 个或多个方程可以共享相同的 where/let block 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/827994/

相关文章:

java - Comparable 是原始类型。对泛型类型 Comparable<T> 的引用应该参数化

c# - Linq 模式匹配

解压未知名称文件的 Bash 脚本

haskell - 我可以从模式同义词中捕获值吗?

haskell - 在镜头库中使用Traversable []和Applicative Maybe的效果

compiler-construction - 编译状态下的 Haskell 可变性?

function - 如何在 F# 中编写自己的 List.map 函数

haskell - 类型族强制参数具有类型 *

haskell : not getting this with IO [FilePath]

haskell - 显式确定要使用哪个纯函数