【问题标题】:Implementation of Recursive Functions in HaskellHaskell中递归函数的实现
【发布时间】:2020-05-22 05:16:58
【问题描述】:

我目前正在学习 haskell,但我的逻辑有问题,尤其是如何执行某些操作。

我想要做什么

  1. 主要目标是拥有一个包含多个缺少单词的句子(语句)的函数,但一次只需要打印一个句子。
  2. 我们还需要另一个函数,它打印出 4 个选项,这些选项将为第一个函数包含/打印的每个语句填写一个完整的句子(然后用户选择这些选项来填写句子)。
    例如。 - “这个 ___ 包含 ____”
    选项:
    1. 字符串、单词
    2. 列表、选项
  3. 现在我们需要另一个函数,它将从函数 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    

这是第二个版本的代码(我在哪里)

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"

【问题讨论】:

  • 如果我试图解决这个问题的方法太复杂并且有更简单的方法,请提及。就像我说的那样,我在如何继续前进的逻辑和语法方面遇到了麻烦
  • 回过头来看,也许我可以把第一个版本的整个代码做成一个函数?然后多次调用该函数,每次更改句子和选项?
  • 你的问题是什么?
  • 如何使用我拥有的代码版本 2 处理“我正在尝试做的事情”部分
  • 第一个版本可以通过拆分答案部分并使用模式匹配进行抽象,而不是使用多个if else

标签: haskell recursive-datastructures


【解决方案1】:

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

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

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

【讨论】:

  • 这对我有所帮助,但我仍然不确定如何进行实际实施,这正是我需要帮助的地方
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
相关资源
最近更新 更多