当前位置: 首页 > 知识库问答 >
问题:

Haskell-Do while循环

祁彬
2023-03-14

我是哈斯克尔的新手,如果有人愿意帮助我,我会很高兴的!我正在尝试让这个程序使用do-while循环

第二个getLine命令的结果被放入变量goGlenn中,如果goGlenn不等于“start ”,那么程序将返回起点

    start = do
    loop $ do lift performAction
        putStrLn "Hello, what is your name?"
        name <- getLine
        putStrLn ("Welcome to our personality test " ++ name ++ ", inspired by the Big Five Theory.") 
        putStrLn "You will receive fifty questions in total to which you can reply with Yes or No."
        putStrLn "Whenever you feel ready to begin please write Start"
        goGlenn <- getLine
        putStrLn goGlenn
    while (goGlenn /= "start")

共有2个答案

居京
2023-03-14

不确定,也许这个版本可以帮助您:

import Control.Monad

loop action = do
    condition <- action
    when condition (loop action)

while = return

start =
    let action = do {
        putStrLn "Hello, what is your name?";
        name <- getLine;
        putStrLn ("Welcome to our personality test " ++ name ++ ", inspired by the Big Five Theory.");
        putStrLn "You will receive fifty questions in total to which you can reply with Yes or No.";
        putStrLn "Whenever you feel ready to begin please write Start";
        goGlenn <- getLine;
        putStrLn goGlenn;
        while (goGlenn /= "start");
    }
    in loop action

(编辑)或者也可以:

start =
    loop (do {
        putStrLn "Hello, what is your name?";
        name <- getLine;
        putStrLn ("Welcome to our personality test " ++ name ++ ", inspired by the Big Five Theory.");
        putStrLn "You will receive fifty questions in total to which you can reply with Yes or No.";
        putStrLn "Whenever you feel ready to begin please write Start";
        goGlenn <- getLine;
        putStrLn goGlenn;
        while (goGlenn /= "start");
    })        
皇甫心思
2023-03-14

在Haskell中,大多数情况下,您递归地编写“循环”。

import Control.Monad

-- ....

start = do
    putStrLn "Before the loop!"
    -- we define "loop" as a recursive IO action
    let loop = do
            putStrLn "Hello, what is your name?"
            name <- getLine
            putStrLn $ "Welcome to our personality test " ++ name 
                     ++ ", inspired by the Big Five Theory."
            putStrLn "You will receive fifty questions in total to which you can reply with Yes or No."
            putStrLn "Whenever you feel ready to begin please write Start"
            goGlenn <- getLine
            putStrLn goGlenn
            -- if we did not finish, start another loop
            when (goGlenn /= "start") loop
    loop  -- start the first iteration 
    putStrLn "After the loop!"
 类似资料:
  • 我刚开始学习Haskell,但是现在没有循环是非常令人沮丧的。我想出了如何为函数编写循环。然而,我的问题是,我想在迭代循环时输出一些结果。似乎我必须使用debug来执行这个简单的任务。 所以现在我只想举一个例子,说明如何在主结构中打印字符串10次。 换句话说,我想这样做10次: 谢谢。我觉得这对我的任务很有启发。

  • Haskell是一种纯函数式编程语言,它的命名源自美国数学家Haskell Brooks Curry,他在数学逻辑方面上的工作使得函数式编程语言有了广泛的基础。Haskell语言是1990年在编程语言Miranda的基础上标准化的,并且以λ演算为基础发展而来。这也是为什么Haskell语言以希腊字母“λ”(Lambda)作为自己的标志。Haskell语言的最重要的两个应用是Glasgow Hask

  • Haskell中的Zippers是一个指向数据结构(例如树)的某些特定位置的指针。 假设具有5个元素的树,可以将其表示为完全二叉树。如果要更新此列表的最后一个元素,则需要遍历所有元素以到达最后一个元素,然后再进行更新。 但是,如果我们以具有N个元素的树是的集合的方式构造树,那该怎么办? 那么,可以不需要遍历所有不需要的(N-1)个元素。直接更新第N个元素,这正是Zipper的概念。它聚焦或指向树的

  • 单子(Monad)只是一种带有某些附加功能的Applicative Functor。它是一个类,它管理三个基本规则(称为一元规则)。 这三个规则严格适用于Monad声明,如下所示: 单子(Monad)式声明的三个基本原则是: 左标识定律 - 返回函数不会更改值,并且不应更改Monad中的任何内容。可以表示为:; 右标识定律 - 返回函数不会改变值,也不会改变Monad中的任何内容。它可以表示为:;

  • Hoogle认为,(Kleisli单子合成,或“左鱼”)和(reverse monad bind)的固定性为。如果我没看错的话,一个表达式,比如 应该是无效的,因为它相当于同样无效的 但是出于某种原因,尽管第一个表达式在Haskell中似乎无效,但正如所料,Frege似乎没有抱怨,并在之前计算。 当我在pointfree.io上搞清楚如何制作类似

  • Mu for Haskell This repo defines a set of libraries to write microservices in a format- and protocol-independent way. It shares the same goals as Mu for Scala, but using idiomatic Haskell and more typ