基于Haskell中的布尔条件执行多个语句

基于Haskell中的布尔条件执行多个语句,haskell,functional-programming,guard-statement,Haskell,Functional Programming,Guard Statement,我是Haskell的新手,如果几个布尔值为真,我将尝试执行多个语句。我试过使用警卫,但它只执行第一条正确的语句,然后停止。我希望它执行所有正确的,例如f5执行gx,然后也执行hx。我试着使用if语句,但我做不到 f x | x < 10 = g x | x < 15 = h x | otherwise = m x fx |x

我是Haskell的新手,如果几个布尔值为真,我将尝试执行多个语句。我试过使用警卫,但它只执行第一条正确的语句,然后停止。我希望它执行所有正确的,例如f5执行gx,然后也执行hx。我试着使用if语句,但我做不到

f x

  | x < 10 = g x

  | x < 15 = h x

  | otherwise = m x
fx
|x<10=gx
|x<15=hx
|否则=m x

这只是一个简化,实际上我有一个不同的程序。情况不同,我只是想像其他编程语言一样使用多个if语句。所以在这个例子中,如果x<10,那么做一些事情,如果x<15也这样做。

在纯函数式编程中,我们不会像在命令式编程中那样执行语句。没有“做这个,然后做那个”的概念。相反,我们主要编写以几个参数作为输入并返回一些输出的函数

如果我们真的想与世界互动,而不仅仅是计算回报值,那该怎么办?在这个特殊的例子中,我们使用IO单子。请注意,这不是我们经常做的事情——我们希望尽可能避免IO单子,以便保持大部分计算的纯粹性

下面是一个例子:

f :: Int -> IO ()
f x = do
   putStrLn "hello"
   if x > 15
   then putStrLn "> 15"
   else putStrLn "not > 15"
   if x > 10
   then putStrLn "> 10"
   else putStrLn "not > 10"
如果您是初学者,我建议您在使用IO monad之前先学习Haskell基础知识。在任何地方使用IO monad都会导致非常不规则的代码

大多数学习FP的命令式程序员试图将他们以前的习惯强加给FP语言——这是很常见的。然而,带有副作用和可变变量的编程不能很好地处理FP。人们需要逐渐停止用有效的陈述来思考,而是重新连接大脑,以便用价值观和(通常是递归的)定义来思考

请注意,FP在这方面并不特殊。如果一个人先学习纯FP,比如在Haskell中,然后接触任何命令式编程语言,他们可能会问这样的问题:“我如何使用状态单子?”。即使你可以在Java中使用状态单子,那也是愚蠢的,因为使用可变变量会更自然。同样,编程试图将以前的方法硬塞进新的语言/范例中,忽略新的特性,并生成单一的代码

“例如,F5执行Gx,然后又执行Hx”

还什么?我们必须返回一些值,这就是Haskell的电子估值

如果需要这两个语句的值,可以将它们组合在一个列表中:

f x = [ g x | x < 10 ] ++ [ h x | x < 15 ] ++ [ m x | True ]
fx=[gx | x<10]+[hx | x<15]+[mx | True]

此列表将包含其
|
(列表)右侧的表达式计算为
True
的所有结果<代码>++将两个列表添加到一个列表中
True
的计算结果通常为
True
,因此可以省略:
[mx]

这一点不清楚。你说的“f 5执行到7,然后执行到8”是什么意思
f
是一个函数,所以如果
f 5=7
,那也不能是
=8
。只是编辑了这篇文章以使其更清晰,这没有意义。不能“执行”7或8。Haskell中没有语句。一般来说,执行
gx
hx
而不知道如何以某种方式组合结果是没有意义的。如果您只是执行
g
h
来消除它们的副作用,那么可能涉及到一个monad。请尝试给出一个函数签名。那将帮助你和我们。