而Haskell中的循环具有条件

Chr*_*ris 5 haskell loops while-loop

我在这里有一点Haskell情况.我正在尝试用monad编写两个函数.只要条件对于函数的输入/输出为真,第一个就应该迭代一个函数.第二个应该使用第一个作为输入的数字并将其作为输出写入,直到您输入空格.

我坚持这个,有什么帮助吗?

module Test where

while :: (a -> Bool) -> (a -> IO a) -> a -> IO a
while praed funktion x = do
                         f <- praed (funktion x)
                         if f == True then do
                                             y <- funktion x
                                             while praed funktion y
                         else return x



power2 :: IO ()
power2 = do putStr (Please enter a number.")
            i <- getChar
            while praed funktion
            where praed x = if x /= ' ' then False else True
                  funktion = i
Run Code Online (Sandbox Code Playgroud)

Pet*_*lák 11

import Control.Monad

while :: (a -> Bool) -> (a -> IO a) -> a -> IO a
while praed funktion x
    | praed x   = do
        y <- funktion x
        while praed funktion y
    | otherwise = return x


power2 :: IO ()
power2 = do
    putStr "Please enter a number."
    i <- getChar
    let praed x = x /= ' '
    let f x = do
        putChar x
        getChar
    while praed f '?'
    return ()
Run Code Online (Sandbox Code Playgroud)

一些说明:

  • 使用if x then True else False是多余的,它等同于x.
  • 同样if x == True ...是多余的,相当于if x ....
  • 您需要区分IO操作及其结果.例如,如果哟

    do
        i <- getChar
        ...
    
    Run Code Online (Sandbox Code Playgroud)

    然后在...中i表示动作的结果,一个角色,所以i :: Char.但是getChar :: IO Char行动本身.您可以将其视为Char执行时返回的配方.您可以将配方传递给函数等,只有在某处执行时才会执行.

  • 你的while被叫funktion两次,这可能不是你想要的 - 它会读取一个角色两次,检查第一个并返回第二个.请记住,您funktion是一个操作,因此每次"调用"操作时(例如,通过<- funktion ...do符号中使用),操作将再次运行.所以它应该是类似的东西

    do
        y <- funktion x
        f <- praed y
        -- ...
    
    Run Code Online (Sandbox Code Playgroud)

    (我的代码有些不同,它会检查传递给它的参数.)