【问题标题】:basic haskell control statements - statement that always runs possible?基本的 haskell 控制语句 - 总是可以运行的语句?
【发布时间】:2010-09-29 05:11:50
【问题描述】:

如果我想执行以下操作:

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

我想要一个始终无条件运行的语句(例如“因为”),我怎么能这样做?字符串是占位符。

谢谢!

编辑:

在我放弃之前,我想尝试根据手头的问题重新表述它。

我有一个函数,它接受两个输入(列表的列表)。

如果给定 [[]] [[[]], [[]]] (或 [[]] [[["x"]], [[]]]) 的样本输入,我想

  • 测试每边是否存在偶数的 [[]],如果存在则将它们全部删除
  • 在每一侧测试奇数然后小块(删除除一个之外的所有)
  • 其他几个类似的东西

然后按照此合并两个输入(清理)并返回它们。到目前为止,在尝试了 case 和 if-then-else 之后,我已经决定了一种保护语法。但这只会让我测试一侧(例如),然后在 = 符号之后加入并返回。除非它太长了......所以承认我还有很多东西要学,我将如何在haskell中做这样的事情?

【问题讨论】:

  • 你还在用命令式思考。 Haskell 中的表达式没有运行,它们被评估并且评估产生一个值。如果你想分解一个公共子表达式,那么你可以使用where关键字

标签: syntax haskell controls


【解决方案1】:

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

例如,你的第二个问题有

number = number * 5
number = number * 2

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

在函数式编程语言中,这些语句要么是错误(您试图根据自身定义一个标量“数字”),要么是布尔表达式(“数字是否等于数字 * 5?”)。

我可以提供的帮助您消除困惑的最佳建议是:忘记在函数式编程语言中更新变量的想法,因为您做不到。相反,请考虑始终计算您想要的值。例如,这里是列表长度函数:

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.

希望这会有所帮助。

【讨论】:

  • 正如已经指出的那样——哦,我慢慢地开始思考haskell 所需的思想。但我想这只能通过练习和时间来实现。是的,这确实有帮助!
【解决方案2】:

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

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

如果您通过“总是运行”来表示其他意思,即即使另一个也运行它也会“运行”,那么我认为您对这种语言的想法是错误的。例如,如果我们有语法:

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

那么foo 1的值应该是多少?

【讨论】:

  • 是的,我还没有设法理解haskell的想法。但是我在一个项目中的某个时刻,我的功能几乎是正确的 - 但需要在警卫完成工作后运行声明。我想我必须创建另一个函数或想办法将它包含在“yay/hey”语句中,尽管那样会很丑(而且很长......)。
  • 你的第二个例子,我打算像 foo x, x = 2 * x, | x == 1 = "one",无论看起来多么糟糕(逗号表示换行)...
【解决方案3】:

函数的唯一目的是返回一个值。但是,如果您对每个条件都有一些共同点,您可以使用where

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

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 2023-01-28
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多