【发布时间】:2019-11-12 22:21:07
【问题描述】:
我有以下函数,它接受两个列表并将每个元素与每个元素进行匹配,并返回一个字符串列表列表。
matchChars:: [t] -> [t] -> [[t]]
matchChars x y = [[a,b] | a<-x, b <-y]
现在我想修改函数,使列表列表中的字符串不会超过一定的长度。
例如:假设matchChars 产生输出[["aaa", "bbbb"],["c", "dd"]]。我想过滤掉两个字符串一起长度为 7 或更高的所有子列表。所以在这个例子中["aaa", "bbbb"] 会被过滤掉。
我已经试过了:
matchChars:: [t] -> [t] -> [[t]]
matchChars x y = takeWhile ((<= 7) . length) [[a,b] | a<-x, b <-y]
但这不起作用,因为它迭代子列表的长度而不是字符串长度。有人知道如何解决我的问题吗?
【问题讨论】:
-
在我看来,正如目前所写的那样,
matchChars只能生成长度为 2 的列表。它似乎与 zip 非常相似,只是它返回一个短列表而不是列表对。这是你想要的吗? -
@jpmarinier 我没有使用 zip,因为它不会将每个元素与每个元素匹配,并且只会压缩相同索引上的元素。
-
@RobinZigmond 我考虑过这一点,但我不想在匹配之前从 x 和 y 中删除 stringy ,因为如果我删除长度较小的字符串,我可能会以这种方式丢失有效的配对7.
-
@T.Naz 抱歉,我删除了我的评论,因为我意识到我误读了你想要达到的目标。
-
您想要
filter结果列表(takeWhile在条件失败时停止获取,即使后面的元素再次满足它)。您使用的谓词应采用列表[a, b]并检查两个字符串的组合长度。提示足够了吗?
标签: haskell pattern-matching list-comprehension