gpt4 book ai didi

haskell - 为什么程序流控制会随机执行

转载 作者:行者123 更新时间:2023-12-04 18:01:46 26 4
gpt4 key购买 nike

我试图通过编写一个简单的数学学习程序来同时学习数学和 Haskell。

它开始于:

  • 生成随机数。
  • 过滤这些数字以创建一个易于处理的问题。
  • 显示问题然后接受我的回答
  • 最后,它将我的答案和正确答案交给另一个函数来给我反馈(“恭喜”--或--“对不起,正确答案是空白”)。

  • 出于某种原因,祝贺功能结束后,它似乎随机选择了下一步要去哪里,要么:
  • 返回 (这是我期望它做的)。
  • 或者在随机循环中它会立即进入数学测试功能。发生这种情况时,第 2 步 从上面不会发生,我开始在问题中得到小数。然后可以重复此步骤或返回 .

  • 在尝试调试问题时,我只会继续按 RETURN 并且它会在不同的时间发生。我还添加了一些调试“打印”语句。

    这是程序中的 3 个函数。请注意,主要调用 funPercentOfNumberToAnother:
    funPercentOfNumberToAnother :: IO ()
    funPercentOfNumberToAnother = do
    (percentDec, percentStr) <- getPercent
    ofNum <- getDecimal (200 :: Decimal)
    let isNum = percentDec * ofNum
    if uglyAnswers ([ofNum, isNum], [percentDec])
    then do
    putStrLn ("ofNum: " ++ show ofNum)
    putStrLn ("isNum: " ++ show isNum)
    putStrLn "___________________________"
    funPercentOfNumberToAnother
    else do
    putStrLn ("ofNum: " ++ show ofNum)
    putStrLn ("isNum: " ++ show isNum)
    putStrLn "Percents"
    -- putStrLn "\n\n"
    putStrLn (show isNum ++ " is what percent of " ++ show ofNum ++ "?\n" )
    putStr "> "
    ans <- getLine
    submitStringAnswer (ans, percentStr ++ "%")

    submitStringAnswer :: (String, String) -> IO ()
    submitStringAnswer (myAns, correctAns) = do
    if myAns == correctAns
    then putStrLn "Congratz!"
    else do
    putStrLn ("Sorry the correct answer is: " ++ show correctAns)
    pause


    pause :: IO ()
    pause = do
    x <- getLine
    putStrLn ""

    这是我的调试输出。请注意,它唯一一次给出小数是在 之后它没有立即返回 main 之后。暂停 结束。
         __  __       _   _                          _   _         
    | \/ | __ _| |_| |__ ___ _ __ ___ __ _| |_(_) ___ ___
    | |\/| |/ _` | __| '_ \ / _ \ '_ ` _ \ / _` | __| |/ __/ __|
    | | | | (_| | |_| | | | __/ | | | | | (_| | |_| | (__\__
    |_| |_|\__,_|\__|_| |_|\___|_| |_| |_|\__,_|\__|_|\___|___/

    1.) Learn Math
    2.) Math Lookup
    3.) Quit Excolo

    1
    ofNum: 35
    isNum: 15.75
    ___________________________
    ofNum: 120
    isNum: 102
    Percents
    102 is what percent of 120?

    >
    Sorry the correct answer is: "85%"


    15.75 is what percent of 35?

    >
    Sorry the correct answer is: "45%"



    __ __ _ _ _ _
    | \/ | __ _| |_| |__ ___ _ __ ___ __ _| |_(_) ___ ___
    | |\/| |/ _` | __| '_ \ / _ \ '_ ` _ \ / _` | __| |/ __/ __|
    | | | | (_| | |_| | | | __/ | | | | | (_| | |_| | (__\__
    |_| |_|\__,_|\__|_| |_|\___|_| |_| |_|\__,_|\__|_|\___|___/

    1.) Learn Math
    2.) Math Lookup
    3.) Quit Excolo

    1
    ofNum: 80
    isNum: 44
    Percents
    44 is what percent of 80?

    >
    Sorry the correct answer is: "55%"



    __ __ _ _ _ _
    | \/ | __ _| |_| |__ ___ _ __ ___ __ _| |_(_) ___ ___
    | |\/| |/ _` | __| '_ \ / _ \ '_ ` _ \ / _` | __| |/ __/ __|
    | | | | (_| | |_| | | | __/ | | | | | (_| | |_| | (__\__
    |_| |_|\__,_|\__|_| |_|\___|_| |_| |_|\__,_|\__|_|\___|___/

    1.) Learn Math
    2.) Math Lookup
    3.) Quit Excolo

    1
    ofNum: 15
    isNum: 2.25
    ___________________________
    ofNum: 60
    isNum: 0.6
    ___________________________
    ofNum: 40
    isNum: 30
    Percents
    30 is what percent of 40?

    >
    Sorry the correct answer is: "75%"


    0.6 is what percent of 60?

    >
    Sorry the correct answer is: "1%"


    2.25 is what percent of 15?

    >
    Sorry the correct answer is: "15%"

    如果有帮助,到目前为止我发现的唯一相关的是: Second of several forked processes does not run in Haskell .

    最后,如果这有助于制定您的答案,我就处于 Monads 的入门级别。

    我很感激任何人都可以提供关于正在发生的事情的任何帮助,id est,为什么它在暂停结束后没有直接返回到 main,以及为什么它会跳过小数过滤器。

    谢谢^^

    最佳答案

    funPercentOfNumberToAnother ,你有这个条款:

    if uglyAnswers ([ofNum, isNum], [percentDec])
    then do
    putStrLn ("ofNum: " ++ show ofNum)
    putStrLn ("isNum: " ++ show isNum)
    putStrLn "___________________________"
    funPercentOfNumberToAnother
    else do
    putStrLn ("ofNum: " ++ show ofNum)
    putStrLn ("isNum: " ++ show isNum)
    putStrLn "Percents"

    如果数字很难看,您的意图是回到函数的开头并重新开始;或以其他方式继续向用户显示数字。就目前而言,这是有效的,但问问你自己......在此结束时会发生什么 if条款?不在 then 中的东西或 else无论如何都会执行分支,一旦 thenelse执行完毕。

    所以,当你得到一些难看的数字时,你会开始一个递归调用,寻找更好的数字并显示它们。然后,当递归调用完成后,您还是继续向用户显示原始的、丑陋的数字!

    这里你需要一个不同的控制流,比如编写一个总是返回一个非丑陋数字的函数,然后在你的(现在是非递归的) funPercentOfNumberToAnother中使用它。功能。或者,您可以将函数主体的其余部分(向用户显示数字的部分)拉入 else if的一部分,这样你就不会对丑陋的数字这样做。

    关于haskell - 为什么程序流控制会随机执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45849782/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com