Myk*_*yke 5 haskell while-loop
作为Haskell的新手,我想知道如何1)计算某些东西,直到满足某个标准,然后2)返回计算值.
在我所知的语言中,你会使用while循环.你是怎么在Haskell做的?
Sho*_*hoe 17
你应该使用递归:
func :: <function type>
func <arguments> =
if condition
then <recursive call>
else computedValue
Run Code Online (Sandbox Code Playgroud)
您将来还会发现其他实用程序,例如until
,它们可以帮助您解决此问题.最后,它实际上取决于循环和条件的语义.例如,如果条件只是"直到我们到达列表的末尾",您可以简单地使用map
或者使用其中一个fold
-family函数.
Haskell没有while
基于可变状态的内在等价的循环.
相反,你通常
map
在一系列值上使用函数族来生成新的值范围filter
在一系列值上使用函数族来生成该范围的新子集,并满足某些条件fold
函数族来聚合该范围内的某些东西.
当然,Haskell和库提供了使您的生活更轻松的功能,但是while
在命令式语言中循环可以被认为是惯用/"第一类",Haskell(和其他函数式编程语言)中的惯用/"第一类"是递归,映射,过滤和折叠.
答案是递归.举一个迂腐的例子:
在Python中:
def fib(n):
a = 0
b = 1
while n > 0:
a, b = b, a + b
n -= 1
return b
Run Code Online (Sandbox Code Playgroud)
在Haskell:
fib 0 = 1
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)
Run Code Online (Sandbox Code Playgroud)
或者等效地没有模式匹配
fib n = if n == 0 || n == 1 then 1 else fib (n - 1) + fib (n - 2)
Run Code Online (Sandbox Code Playgroud)
或者更有效率
-- the local variable fibs is an infinite list of all Fibonacci numbers
fib n = fibs !! n where fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
如果你想做一些像读取文本的东西,STDIN
直到你得到一行读取q
,那么最简单的方法是这样的
import Control.Monad (unless)
prompt :: IO ()
prompt = do
-- get input from user
l <- getLine
-- unless will execute its block if the condition is False
unless (l == "q") $ do
-- echo back to the user
putStrLn $ "You entered: " ++ l
prompt -- recursive step here
Run Code Online (Sandbox Code Playgroud)
或者在Python中
def prompt():
l = input()
while l != "q":
# Assuming Python 3
print("You entered: " + l)
l = input()
Run Code Online (Sandbox Code Playgroud)