Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Syntax 基本haskell控制语句-始终可以运行的语句?_Syntax_Haskell_Controls - Fatal编程技术网

Syntax 基本haskell控制语句-始终可以运行的语句?

Syntax 基本haskell控制语句-始终可以运行的语句?,syntax,haskell,controls,Syntax,Haskell,Controls,如果我想做以下事情: function1 stuff | condition1 = "yay" | condition2 = "hey" | condition3 = "nay" 我想要一个总是无条件运行的语句(例如“因为”),我怎么能这样做呢?字符串是占位符 谢谢 编辑: 在我放弃之前,我想试着根据手头的问题重新表述一下 我有一个函数,它接受两个输入(列表列表) 如果给定的示例输入为[[]][[[]]、[[[]]](或[[]][[[“x”]]、[[]]),我想 测试每侧是否存在偶数的

如果我想做以下事情:

function1 stuff
| condition1 = "yay" 
| condition2 = "hey" 
| condition3 = "nay" 
我想要一个总是无条件运行的语句(例如“因为”),我怎么能这样做呢?字符串是占位符

谢谢

编辑:

在我放弃之前,我想试着根据手头的问题重新表述一下

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

如果给定的示例输入为[[]][[[]]、[[[]]](或[[]][[[“x”]]、[[]]),我想

  • 测试每侧是否存在偶数的[[]],如果存在,则将其全部删除
  • 测试每侧的奇数,然后是nub(删除除一个以外的所有)
  • 其他一些类似的事情

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

如果您的意思是如果其他所有条件都失败,那么只需使用
否则

foo x
    | x == 0 = "yay"
    | x == 1 = "hey"
    | x >= 2 = "nay"
    | otherwise = "negative"
如果你所说的“始终运行”是指其他的东西,即即使另一个也运行,它也会“运行”,那么我认为你对这种语言的想法是错误的。例如,如果我们有语法:

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

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

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

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

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

例如,您的第二个问题

number = number * 5
number = number * 2
在命令式语言中,这表示“将名为“number”的内存单元的当前内容更新5次;然后将名为“number”的内存单元的当前内容更新2次”

在函数式编程语言中,这些语句要么是一个错误(您试图定义一个标量“数字”本身),要么是布尔表达式(“数字是否等于数字*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中的表达式不会运行,会对其求值并生成一个值。如果你想找出一个常见的子表达式,那么你可以使用
where
关键字true,我仍然没有设法让我的头脑围绕haskell思考。但我现在正处于一个项目中,我有一个几乎正确的功能——但需要在警卫完成任务后运行一个声明。我想我得做另一个函数,或者想办法把它包含在“yay/hey”语句中,虽然这会很难看(而且很长……)。关于你的第二个例子,我打算用foo x,x=2*x,|x==1=“one”,不管看起来有多糟糕(逗号表示换行符)…正如已经指出的-我是如此缓慢地开始思考haskell所需要的想法。但我想这只需要练习和时间。是的,这确实有用!