Haskell中while循环的等价语句是什么?

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函数.

  • @Myke如果你以某种语言给出一些`while`循环作为例子,我可能会告诉你Haskell中的等价物. (2认同)

Seb*_*ach 7

Haskell没有while基于可变状态的内在等价的循环.

相反,你通常

  • map在一系列值上使用函数族来生成新的值范围
  • filter在一系列值上使用函数族来生成该范围的新子集,并满足某些条件
  • 使用fold函数族来聚合该范围内的某些东西
  • 使用递归来做任何你想做的事情(当然,改变输入除外).

.

当然,Haskell和库提供了使您的生活更轻松的功能,但是while在命令式语言中循环可以被认为是惯用/"第一类",Haskell(和其他函数式编程语言)中的惯用/"第一类"是递归,映射,过滤和折叠.


bhe*_*ilr 7

答案是递归.举一个迂腐的例子:

在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)

  • 可能值得一提的是为什么第一个和第二个Haskell版本的`fib`是一个坏主意. (4认同)