递归函数在Haskell中的实现

递归函数在Haskell中的实现,haskell,recursive-datastructures,Haskell,Recursive Datastructures,我现在正在学习haskell,我的逻辑有问题,尤其是如何执行某些动作 我想做什么 其主要目标是使函数包含多个缺少单词的句子(语句),但一次只需要打印一个句子 我们还需要另一个函数,它打印出4个选项,这些选项将为第一个函数包含/打印的每个语句填写完整的句子(然后用户选择这些选项来填写句子)。 例如—“此包含” 选项: 字串 列表、选项 等 等 现在我们需要另一个函数,它将从函数1中获取每个句子,以及用户从函数2中选择的选项,并创建一个完整的句子并将其返回给用户 我不确定我们是否需要一个单独的函数

我现在正在学习haskell,我的逻辑有问题,尤其是如何执行某些动作

我想做什么
  • 其主要目标是使函数包含多个缺少单词的句子(语句),但一次只需要打印一个句子
  • 我们还需要另一个函数,它打印出4个选项,这些选项将为第一个函数包含/打印的每个语句填写完整的句子(然后用户选择这些选项来填写句子)。
    例如—“此包含”
    选项:
  • 字串
  • 列表、选项
  • 现在我们需要另一个函数,它将从函数1中获取每个句子,以及用户从函数2中选择的选项,并创建一个完整的句子并将其返回给用户
  • 我不确定我们是否需要一个单独的函数来接收用户输入并存储他们从函数2中选择的值,以完成函数1中的句子,或者我们是否也可以将其添加到函数2中

    我所能创造的 我能够执行上述操作,但我只能执行一句话,而且所有操作都在一个函数中(在我看来,这并不能提高代码的效率和可重用性)。
    我再次尝试了我心目中的结构(如上图所示),但正如我所说的,我被逻辑所束缚,不确定如何去做。下面是我编写的两个版本的代码,第一个版本展示了我的目标,但我只能用一句话来完成,第二个版本就是我现在尝试使用多个函数的地方,但我不确定下一步该怎么做

    这是第一个版本的代码

    --First Version
    import Data.List
    import System.IO
    
    main :: IO()
    
    sentences = do
        putStrLn "The Cat is ______ from ______ the city \n"
        putStrLn "Here are your options:"
        putStrLn "A. big, nearby"
        putStrLn "B. Nearby, in"
        putStrLn "C: You, By"
        putStrLn "D: By, Yourself"
        option <- getChar
        if (option == 'A' || option == 'a')
            then putStrLn "The Cat is big from nearby the city"
        else if (option == 'B' || option == 'b')
            then putStrLn "The Cat is nearby from in the city"
        else putStrLn "Error"
    
    main = sentences    
    

    这似乎是一个关于数据建模的问题。到目前为止,您的解决方案是在字符级别上运行的:您定义字符串,其中一个特定字符,
    \uu
    充当占位符,并且您希望在此位置插入其他字符

    编程是关于抽象的。因此,退一步,不要从单个字符的角度考虑问题,而要从句子片段和占位符的角度考虑问题。句子片段和占位符组成一个句子。为这三种类型定义数据类型。然后,看看您需要的功能。您需要能够在屏幕上显示句子片段和占位符的函数,并且需要能够将句子片段和占位符组合成句子的函数。最后,您需要一个函数来根据片段和占位符的显示函数来显示整个句子


    一旦你有了这个抽象,你可以用另一个句子片段替换占位符并显示它

    这似乎是一个关于数据建模的问题。到目前为止,您的解决方案是在字符级别上运行的:您定义字符串,其中一个特定字符,
    \uu
    充当占位符,并且您希望在此位置插入其他字符

    编程是关于抽象的。因此,退一步,不要从单个字符的角度考虑问题,而要从句子片段和占位符的角度考虑问题。句子片段和占位符组成一个句子。为这三种类型定义数据类型。然后,看看您需要的功能。您需要能够在屏幕上显示句子片段和占位符的函数,并且需要能够将句子片段和占位符组合成句子的函数。最后,您需要一个函数来根据片段和占位符的显示函数来显示整个句子


    一旦你有了这个抽象,你可以用另一个句子片段替换占位符并显示它

    如果我试图解决这个问题的方法太复杂,有一个更简单的方法,请提及。正如我所说,我在逻辑和语法方面遇到了问题,无法进一步回顾,也许我可以将第一个版本的全部代码转换成一个函数?然后多次调用该函数,每次都更改句子和选项?你的问题是什么?我如何使用我拥有的代码版本2进行“我正在尝试做什么”部分第一个版本可以通过划分答案部分并使用模式匹配进行抽象,如果我试图解决这个问题的方法太复杂,并且有一个更简单的方法,请提及。正如我所说,我在逻辑和语法方面遇到了问题,无法进一步回顾,也许我可以将第一个版本的全部代码转换成一个函数?然后多次调用该函数,每次都更改句子和选项?你的问题是什么?我如何使用我拥有的代码版本2进行“我正在尝试做什么”部分第一个版本可以通过划分答案部分并使用模式匹配进行抽象,与使用多个
    if else
    相比,这对我有点帮助,但我仍然不确定如何进行实际实施,这是我需要的帮助。这对我有点帮助,但我仍然不确定如何进行实际实施,这是我需要的帮助
    import Data.List
    import System.IO
    main :: IO()
    
    --This function contains all the sentences 
    sentences = do
        putStrLn "\nThe Cat is ______ from the ______  \n"
        putStrLn "\nThe Cow belongs to ______ from ______ ______ \n"
        putStrLn "\nThe Man lives in ______ and is neighbours with ______ \n"
    
    -- This function basically prints after each sentence is displayed to signal to the user that they need to select an option
    optionsText = do
        putStrLn "Here are your options: \n"
    
    -- These Functions contain the different options for different sentences
    options1 = do
        putStrLn "A. Running, dog"
        putStrLn "B. Hiding, Man"
        putStrLn "C. Eating, Trash"
        putStrLn "D. Calling, Roof"
    
    options2 = do
        putStrLn "A. Tom, Next, Door"
        putStrLn "B. Rick, My, Neighbour"
        putStrLn "C. Man, farm, place"
        putStrLn "D. Sheltor, Animal, Factory"
    
    option3 = do
        putStrLn "A. Australia, Me"
        putStrLn "B. UK, Actor"
        putStrLn "C. Florida, Tom"
        putStrLn "D. House, Dog"