我是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则也执行此操作。
答案 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 ]
。