如何使用isSuffixOf来测试两个后缀

时间:2018-03-12 05:22:19

标签: haskell

所以我有一个字符串列表说[" test1"," test2"," test3"," exam1"],以及我想弄清楚哪些以" 1"或" 2"。 我知道我可以使用

map (isSuffixOf "1") ["test1", "test2", "test3", "exam1"]
map (isSuffixOf "2") ["test1", "test2", "test3", "exam1"]

得到两个不同的bool列表,但有什么方法可以同时测试两个?我试过这两个变种

map (isSuffixOf "1" || "2") ["test1", "test2", "test3", "exam1"]
map (isSuffixOf "1" || isSuffixOf "2") ["test1", "test2", "test3", "exam1"]

但他们都给了我一个错误

2 个答案:

答案 0 :(得分:5)

您可以使用lambda表达式指定映射函数

map (\x -> isSuffixOf "1" x || isSuffixOf "2" x) ["test1", "test2", "test3", "exam1"]  

或者,您可以使用Applicative (->) a实例来构建函数

map ((||) <$> isSuffixOf "1" <*> isSuffixOf "2") ["test1", "test2", "test3", "exam1"]  

或使用liftA2(在Control.Applicative中找到)

map (liftA2 (||) (isSuffixOf "1") (isSuffixOf "2")) ["test1", "test2", "test3", "exam1"] 

答案 1 :(得分:3)

你可以在这里使用箭头。

import Control.Arrow

f = isSuffixOf "1" &&& isSuffixOf "2"
result = map (uncurry (||)) . map f $ ["test1", "test2", "test3", "exam1"]

或者更简单地说,只需编写一个列表comp。

result = [isSuffix "1" x || isSuffix "2" x | x <- ["test1", "test2", "test3", "exam1"]]

或者更简单地说,自己写两个组合器。

anySuffixOf []     _ = False
anySuffixOf (x:xs) y = isSuffixOf x y || f xs y

result = map (anySuffixOf ["1", "2"]) ["test1", "test2", "test3", "exam1"]