【发布时间】:2013-03-14 19:48:48
【问题描述】:
假设我有一个函数可以进行一些计算,有几种模式;以模式匹配的形式实现。
这些模式中的大多数(以及其他不同的东西)对参数进行处理,为此我在let 表达式中使用中间变量。但是我发现在许多模式上使用相同的let 确实是多余的,我想知道是否有一种方法可以为多个模式定义一个let?
这是我重复的let 的示例:
data MyType a = Something a | Another Int [a]
myFunc (Something x) = -- return something, this isn't the point here
myFunc (Another 0 xs) =
let intermediary = some $ treatment xs
in doSthg intermediary 1
myFunc (Another 1 (x:xs)) =
let intermediary = some $ treatment xs
in doSthg1 intermediary 1 x
myFunc (Another 2 (x:x':xs)) =
let intermediary = some $ treatment xs
in doSthg2 intermediary 2 x x'
您可以看到,当我将参数xs 用于intermediary 时,它始终存在,这可以被分解。
它可以通过使用辅助函数轻松实现,但我想知道如果没有辅助函数,我的要求是否可行。对于初学者,请尽量保持简单,我希望我的例子足够清楚。
【问题讨论】:
-
不!必须使用单独的函数并将其作为参数显式传递以排除重复的代码。就 Haskell 而言,以上出现的
xs是完全不同的变量(因为它们有不同的绑定位点)。 -
谢谢!现在我有另一个问题:你是否打算让第三个和第四个方程永远不匹配?因为
xs匹配任何列表...您是否颠倒了方程式的顺序? -
我写这个是为了说明
xs是从模式匹配中提取的几个模式,但并不总是具有相同的含义(否则模式匹配将没有兴趣:只有一个图案)。在示例中用它做了什么并不重要。但在我的代码中,y被替换为实际值,因此后面的模式匹配。但你又是对的,所以我将用具体的类型对其进行编辑,以使整个事情更容易理解。
标签: haskell functional-programming pattern-matching let