我有一份上学的任务,我需要帮助。到目前为止,我根据分配说明创建了两种类型Argument
和Predicate
。
在这个项目中,我必须在标题为“fact”的列表中创建一个名为“context”的列表,其中包含世界中的参数(或对象)以及关于这些对象的事实列表。
因此,例如,上下文列表具有参数“john”和“boston”,然后在我们的事实列表中,我们可以创建一个带有函数fly
的谓词,以获得一个事实“fly john to_boston”其中{ {1}}表示约翰飞往波士顿。
对于项目的最后一步,我们必须能够问Haskell:“qWhere fly john”并让Haskell搜索“john”的上下文列表并使用它来搜索“fly”的事实列表和“约翰”为了最终回归“to_boston”或“波士顿”。
我知道这是嵌套列表理解,但是我不明白如何让Haskell在“飞行约翰”中返回“to_boston”。我将在下面包含一些代码(滚动到底部,我正在处理的内容):
to
答案 0 :(得分:1)
我认为你不需要/想要嵌套列表理解。首先,您需要了解list comprehension实际上只是语法糖。
但我们可以使用let ... in
语法来使用多个列表推导。解决方案可能如下所示:
qWhere :: (Argument -> Argument -> Predicate)
-> Argument
-> [[Argument]]
qWhere f x = case find (== x) context of
Just e ->
-- first we get all facts about e.g. john
let personFacts = [z | z <- facts, e `elem` arguments z]
-- then we get all facts when we apply f to john and
-- any other arguments that exist in john
actionFacts = fmap (f e) (concatMap arguments personFacts)
-- and extract all arguments of those facts
actionArgs = concatMap arguments actionFacts
-- and can finally build the actual list of facts,
-- reduced by checking if the argument "john" is in one of our
-- actionArgs where we applied f to
in map arguments [z | z <- personFacts, e `elem` actionArgs]
Nothing -> []
您可能需要import Data.List
。