基本的haskell控制语句 - 总是可以运行的语句?

时间:2010-09-28 04:53:52

标签: syntax haskell controls

如果我想做以下事情:

function1 stuff
| condition1 = "yay" 
| condition2 = "hey" 
| condition3 = "nay" 

我希望有一个总是无条件地运行的声明(例如“因为”),我怎么能这样做?字符串是占位符。

谢谢!

编辑:

在我放弃这一点之前,我想尝试根据手头的问题对其进行改写。

我有一个带两个输入(列表列表)的函数。

如果给出[[]] [[[]],[[]]](或[[]] [[[“x”]],[[]]]的样本输入,我想

  • 测试每边是否存在均匀的[[]],如果是,则全部删除
  • 测试每一方的奇数金额然后结算(删除除一条之外的所有金额)
  • 其他几个类似的事情

然后在此之后将两个输入组合(清理)并返回它们。到目前为止,在尝试使用case和if-then-else之后,我已经决定了一个保护语法。但这只允许我测试一侧(例如)然后在=符号之后加入并返回。除非它太长了......所以承认我还有很多需要学习的东西,我怎样才能在哈斯克尔做这样的事情呢?

3 个答案:

答案 0 :(得分:4)

您的问题并不真正适用于函数式编程语言,例如Haskell。我的第一个问题是,“当我还想做B时,我怎么总是在这做A?”。你的第二个问题是类似的:“我怎么做A然后B?”。这些问题对命令式语言(例如OO语言)有意义,其中您的程序基本上告诉计算机如何继续。但是,在函数式语言中,你说你想要计算什么,但这完全取决于编译器如何这样做(用一点点盐来做,但这就是总体思路)。

例如,您的第二个问题有

number = number * 5
number = number * 2

在命令式语言中,它读取“更新名为'number'的存储单元,其当前内容为5; 然后更新名为'number'的存储单元,其当前内容为2”。

在函数式编程语言中,这些语句要么是错误(你试图用自身来定义标量“数字”),要么是布尔表达式(“数字等于数字* 5?”)。 / p>

我可以提供的最好的建议是帮助消除您的困惑:忘记所有关于在函数式编程语言中更新变量的想法,因为您无法做到这一点。相反,想想总是计算你想要的价值。例如,这是列表长度函数:

length []     = 0                 -- The empty list has zero items.
length (x:xs) = 1 + length xs     -- The non-empty list (x:xs) has one more item than xs.

希望这有帮助。

答案 1 :(得分:2)

如果你的意思是如果一个条件在所有其他条件都失败的情况下成功,那么只需使用otherwise

foo x
    | x == 0 = "yay"
    | x == 1 = "hey"
    | x >= 2 = "nay"
    | otherwise = "negative"

如果你的意思是“总是跑”,即使另一个也跑了,它会“跑”,那么我认为你认为这种语言是错误的。例如,如果我们有语法:

foo x
    | x == 1 = "one"
    | always = "any"

那么foo 1的价值应该是什么?

答案 2 :(得分:2)

函数的唯一目的是返回一个值。但是,如果您具有每个条件共享的一些共性,则可以使用where

function1 stuff
  | condition1 = "yay" ++ otherstuff
  | condition2 = "hey" ++ otherstuff
  | condition3 = "nay" ++ otherstuff
  where otherstuff = "!"