“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函数将问题作为参数,如果是,那么为什么它在括号内?
答案 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)
这是使用合成运算符(.)
的函数合成。该链接比我能更好地解释了这一点。您有三个功能prepare
,answer
和present
。您可以将question
,prepare
传送到answer
,然后将present
反馈给您的用户。 prepare
处理某种形式的打印结果给您的最终用户,因此返回包含在IO
中的类型。
现在,回答你的问题:
任何人都可以解释为什么我们之后做=(chatterbot botName botRules = do ...)什么是botloop?它是C中的标签吗?什么是这个代码中的功能?没有地方可以写吗? “botloop = do ......”这是什么意思?
我在上面解释了botloop
。至于where
子句的作用,您可以在任何haskell教程中找到它。例如,HaskellWiki在这里为您提供了一些信息。
任何人都可以解释这个条件(不是.oreOfDialog)的问题吗? endOfDialog函数将问题作为参数,如果是,那么为什么它在括号内?
这是功能构成。查看not
和endOfDialog
的类型并将它们拼凑在一起。