Haskell:嵌套列表理解

时间:2014-10-29 13:22:03

标签: haskell

我有一份上学的任务,我需要帮助。到目前为止,我根据分配说明创建了两种类型ArgumentPredicate

在这个项目中,我必须在标题为“fact”的列表中创建一个名为“context”的列表,其中包含世界中的参数(或对象)以及关于这些对象的事实列表。

因此,例如,上下文列表具有参数“john”和“boston”,然后在我们的事实列表中,我们可以创建一个带有函数fly的谓词,以获得一个事实“fly john to_boston”其中{ {1}}表示约翰飞往波士顿。

对于项目的最后一步,我们必须能够问Haskell:“qWhere fly john”并让Haskell搜索“john”的上下文列表并使用它来搜索“fly”的事实列表和“约翰”为了最终回归“to_boston”或“波士顿”。

我知道这是嵌套列表理解,但是我不明白如何让Haskell在“飞行约翰”中返回“to_boston”。我将在下面包含一些代码(滚动到底部,我正在处理的内容):

to

1 个答案:

答案 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