我有以下函数,该函数接受两个列表,并将每个元素与每个元素匹配,然后返回字符串列表的列表。
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]
但是,这在迭代子列表的长度而不是字符串的长度时不起作用。有人知道如何解决我的问题吗?
答案 0 :(得分:3)
就您而言,我认为filter
比takeWhile
更合适,就像Robin一样。
像这样:
λ>
λ> myFilter = filter (\[ls1, ls2] -> (7 > (length ls1 + length ls2)))
λ>
λ> myFilter [["aaa", "bbbb"],["c", "dd"]]
[["c","dd"]]
λ>
函数takeWhile仅用于获取满足您的谓词的项目的初始和连续段。