根据Haskell中的布尔条件执行多个语句

时间:2019-03-03 12:01:09

标签: haskell functional-programming guard-statement

我是Haskell的新手,如果几个布尔值都为true,我将尝试执行多个语句。我使用了警卫队尝试了它,但它只执行了第一条正确的语句,然后停止了。我希望它执行所有正确的示例,例如f 5执行g x,然后还执行h x。我用if语句尝试过,但是不能。

f x

  | x < 10 = g x

  | x < 15 = h x

  | otherwise = m x

这只是一个简化,实际上我有一个不同的程序。情况不同,我只是想像其他编程语言一样具有多个if语句。因此,在此示例中,如果x <10则执行某项操作,如果x <15则也执行此操作。

2 个答案:

答案 0 :(得分:9)

在纯函数式编程中,我们不像在命令式编程中那样执行语句。没有“先做然后做”的概念。取而代之的是,我们主要编写将一些参数作为输入并返回一些输出的函数。

如果我们确实想与世界互动而不只是计算返回值怎么办?好吧,在这种情况下,我们求助于IO monad。请注意,这不是我们经常执行的操作-我们宁愿尽可能避免IO monad,以保持大多数计算的纯净。

这是一个例子:

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在这方面并不特殊。如果先用Haskell说过,然后再使用任何命令式编程语言,首先学习了纯粹的FP,那么他们可能会问这样的想法:“我如何使用状态monad?”。即使您可以在-say- Java中使用state monad,这也很愚蠢,因为使用可变变量会更加自然。再次,编程人员试图将他们以前的方法塞入新的语言/范例中,忽略新功能,并生成单项代码。

答案 1 :(得分:4)

  

“例如,f 5执行g x,然后还执行h x”

返回什么?我们必须返回一些,这就是Haskell的 e-value-ation 的方式。

如果您想要这两个语句的值,则可以通过将它们放在列表中来组合它们:

f x = [ g x | x < 10 ] ++ [ h x | x < 15 ] ++ [ m x | True ]

此列表将包含其|(列表理解防护)右边的表达式求值为True的所有结果。 ++将两个列表加在一起。 True的取值为True,因此可以省略:[ m x ]