如果我想做以下事情:
function1 stuff
| condition1 = "yay"
| condition2 = "hey"
| condition3 = "nay"
我希望有一个总是无条件地运行的声明(例如“因为”),我怎么能这样做?字符串是占位符。
谢谢!
编辑:
在我放弃这一点之前,我想尝试根据手头的问题对其进行改写。
我有一个带两个输入(列表列表)的函数。
如果给出[[]] [[[]],[[]]](或[[]] [[[“x”]],[[]]]的样本输入,我想
然后在此之后将两个输入组合(清理)并返回它们。到目前为止,在尝试使用case和if-then-else之后,我已经决定了一个保护语法。但这只允许我测试一侧(例如)然后在=符号之后加入并返回。除非它太长了......所以承认我还有很多需要学习的东西,我怎样才能在哈斯克尔做这样的事情呢?
答案 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 = "!"