列表理解:If、then和使用Haskell返回1值 findMatch::[String]->[String] findMatch xs= let关键字=[(“数据”,“集”)] 在[if null x然后“null”else fst y | x

列表理解:If、then和使用Haskell返回1值 findMatch::[String]->[String] findMatch xs= let关键字=[(“数据”,“集”)] 在[if null x然后“null”else fst y | x,haskell,if-statement,io,Haskell,If Statement,Io,中,我认为问题在于您对列表理解的理解。请尝试以下方法: in [ if (snd y) == x then fst y else "null" | x <- xs, y <- keywords] [(x,y)| x我认为问题在于你对列表理解的理解。尝试以下方法: in [ if (snd y) == x then fst y else "null" | x <- xs, y <- keywords] [(x,y)|xnull x仅在列表为空时才会返回false。在这里

中,我认为问题在于您对列表理解的理解。请尝试以下方法:

in [ if (snd y) == x then fst y else "null" | x <- xs, y <- keywords]

[(x,y)| x我认为问题在于你对列表理解的理解。尝试以下方法:

in [ if (snd y) == x then fst y else "null" | x <- xs, y <- keywords]

[(x,y)|x
null x
仅在列表为空时才会返回false。在这里,您将null应用于
[Char]
a.k.a.
字符串
。但是,在列表理解中,您的谓词可以防止x不等于
关键字中元组的第二个元素


在列表理解中,仅当元素与所有谓词匹配时才包含该元素。

null x
仅当列表为空时才会返回false。这里将null应用于
[Char]
a.k.a.
String
。但是列表中的谓词可以防止x不等于
关键字中元组的第二个元素


在列表理解中,只有当一个元素与所有谓词匹配时,它才会被包括在内。

我想你想要的是

[(x, y) | x <- [1,2,3], y <- [1,2]]
在第一种情况下,如果交换
关键字
对会更好

in concat [case [key | (key,word) <- keywords, word == x] of { [] -> ["null"]; ms -> ms; } | x <- xs]
let关键字=[(“设置”、“数据”)]

在[fromMaybe“null”$lookup x keywords | x中,我想你想要的是

[(x, y) | x <- [1,2,3], y <- [1,2]]
在第一种情况下,如果交换
关键字
对会更好

in concat [case [key | (key,word) <- keywords, word == x] of { [] -> ["null"]; ms -> ms; } | x <- xs]
let关键字=[(“设置”、“数据”)]


在[fromMaybe“null”$lookup x keywords | x中,你能添加一个输入和输出示例吗?我是Haskell的新手,但我希望能帮助你解决这个问题。Userinput可以是“搜索一个集合”,这个列表可以看到“集合”一词,然后返回“数据”一词它被我的程序的另一部分使用。但是如果找不到匹配项,我希望它返回“null”,这将触发程序的另一部分。理解工作正常。然后就是工作不正常。你能添加一个输入和输出示例吗?我是Haskell的新手,但我希望能帮助你解决这个问题。Userinput可能是“搜索一个集合”,这个列表将看到单词“set”,并返回单词“data”,它被我的程序的另一部分使用。但是如果找不到匹配项,我希望它返回“null”“这将触发程序的另一部分。理解工作正常。then就是不正常工作。我的列表理解正是我希望它做的。唯一的问题是(在第二个示例中)它返回“null”的次数比我需要的次数多。我只需要它返回一次。@如果你的意思是
xs=[“s1”,“s3”]
关键字=[(“d1”、“s1”),(“d2”、“s2”)]
给了你类似于
[“d1”,null,null,null]
的东西,这是因为列表理解产生了
(x,y)的所有可能组合
,即笛卡尔积。pmr的答案表明了第一种方法不起作用的原因。也许我可以将结果附加到列表中,然后只返回该列表中的第一个元素?这不是最优雅的解决方案,但它可以纠正问题。@很好,因为列表理解已经做了嵌套循环之类的事情,您可以不妨在
xs
中搜索
关键字
中的每个元素。我不确定你的建议将如何发挥作用,似乎你想要一个(重复的)列表
xs
中每个元素的结果,但是如何跟踪它们呢?因为只有两种可能的输出:来自关键字变量的字符串,或者字符串“null”我将试着看看当我把它拆分成两个单独的函数时会发生什么。我的列表理解完全符合我的要求。唯一的问题是(在第二个示例中)它返回“null”的次数比我需要的次数多。我只需要它返回一次。@如果你的意思是
xs=[“s1”,“s3”]
关键字=[(“d1”,“s1”),(“d2”,“s2”)]
给你类似于
[“d1”,null,null,null]
这是因为列表理解产生了
(x,y)的所有可能组合
,即笛卡尔积。pmr的答案表明了第一种方法不起作用的原因。也许我可以将结果附加到列表中,然后只返回该列表中的第一个元素?这不是最优雅的解决方案,但它可以纠正问题。@很好,因为列表理解已经做了嵌套循环之类的事情,您可以不妨在
xs
中搜索
关键字
中的每个元素。我不确定你的建议将如何发挥作用,似乎你想要一个(重复的)列表
xs
中每个元素的结果,但是如何跟踪它们呢?因为只有两种可能的输出:来自关键字变量的字符串,或者字符串“null”。"我将试着看看当我把它分成两个独立的函数时会发生什么。我想就是这样。我现在正在测试它。这就成功了!只剩下一个问题:这个函数似乎抵消了我拥有的其他函数,它们做同样的事,但有其他关键字。但我想我可以找到一个解决方案。我将尝试把所有的将函数的个数转换为1个函数。谢谢你的帮助。将关键字列表作为函数的参数可能是个好主意。我想就是这样。我现在正在测试它。这就成功了!只剩下一个问题:这个函数似乎抵消了我的其他函数,这些函数与其他关键字做相同的事情。但我认为我可以我找到了一个解决方案。我将尝试将所有函数放在一个函数中。感谢您的帮助。将关键字列表作为函数的参数可能是一个好主意。