Haskell代码需要解释

时间:2013-11-10 07:36:51

标签: haskell

“Chatterbot模块中的主要功能如下所示。它本质上是一个交互式循环,它读取一行输入,然后通过写一行输出来响应。

chatterbot :: String -> [(String, [String])] -> IO ()
chatterbot botName botRules = do
    putStrLn ("\n\nHi! I am " ++ botName 
                              ++ ". How are you?")
    botloop
  where
    brain = rulesCompile botRules
    botloop = do
      putStr "\n: "
      question <- getLine
      answer <- stateOfMind brain
      putStrLn (botName ++ ": " 
         ++ (present . answer . prepare) question)
      if (not . endOfDialog) question 
         then botloop 
         else return ()

http://cs.lth.se/english/course/edan40_functional_programming/programming_assignments/chatterbots/

任何人都可以解释为什么我们做了=(chatterbot botName botRules = do ...) 什么是botloop?它是C中的标签吗? 什么是这个代码中的功能?没有地方可以写吗? “botloop = do ......”这是什么意思?

任何人都可以解释这个条件(不是.oreOfDialog)的问题吗? endOfDialog函数将问题作为参数,如果是,那么为什么它在括号内?

1 个答案:

答案 0 :(得分:1)

首先,我强调让自己成为一个好的Haskell tutorial并完成它。如果您在尝试解决方案时付出了一些努力,那么Haskell人员在回答问题时会非常有帮助。我会让你离开这一次。 : - )

让我们一个接一个地选择这个:你正在编写一个带有运行循环的聊天机器人,你可以提出问题并找回答案。 IOW,你的聊天机器人会继续等待问题,并在获得答案后立即随机吐出答案。

chatterbot :: String -> [(String, [String])] -> IO ()

以下是chatterbot函数的类型定义。这表示它接受String和每个(String, [String])返回一些IO操作的对的列表 - 在这种情况下类似void

让我们深入了解botloop

    botloop = do
      putStr "\n: "
      question <- getLine
      answer <- stateOfMind brain
      putStrLn (botName ++ ": " 
         ++ (present . answer . prepare) question)

正如我上面所说,这是一个连续的循环函数,只要chatterbot用户提出的问题没有信号对话结束,它就会运行。这很重要,因为否则你的循环没有终止条件,它会永远持续下去。就在这里:

     if (not . endOfDialog) question -- If the question does not mean endOfDialog
     then botloop                    -- go into the botloop
     else return ()                  -- else exit this function. 

返回botloop - 在这里你需要问自己一些问题:

  • stateOfMind是什么意思?特别是,stateOfMind的类型是什么?

      answer <- stateOfMind brain
    

在这里,我根据brain得到stateOfMind的答案。现在,它是什么?我告诉你,因为它是你家庭作业的一部分。 : - )

  • brain给了我什么?

    brain = rulesCompile botRules
    

brain只是所有botRules的汇编 - 必须在chatterbot函数的输入中指定。现在,rulesCompile是另一个编译所有botRules以生成BotBrain的函数 - 这是您持久的状态机,可以保存所有聊天机器人的答案/讽刺/厚脸皮。 : - )

  • 您如何向用户展示聊天机器人的答案? 就在这里:

    (present . answer . prepare) question)

这是使用合成运算符(.)的函数合成。该链接比我能更好地解释了这一点。您有三个功能prepareanswerpresent。您可以将questionprepare传送到answer,然后将present反馈给您的用户。 prepare处理某种形式的打印结果给您的最终用户,因此返回包含在IO中的类型。

现在,回答你的问题:

  
    

任何人都可以解释为什么我们之后做=(chatterbot botName botRules = do ...)什么是botloop?它是C中的标签吗?什么是这个代码中的功能?没有地方可以写吗? “botloop = do ......”这是什么意思?

  

我在上面解释了botloop。至于where子句的作用,您可以在任何haskell教程中找到它。例如,HaskellWiki在这里为您提供了一些信息。

  
    

任何人都可以解释这个条件(不是.oreOfDialog)的问题吗? endOfDialog函数将问题作为参数,如果是,那么为什么它在括号内?

  

这是功能构成。查看notendOfDialog的类型并将它们拼凑在一起。