Haskell--搜索元素列表

时间:2014-08-11 03:45:44

标签: search haskell

我想搜索一个Chars列表的列表,[[Char]]确定Char是否在列表中,返回true或false。到目前为止,我有这个,

    scanBoard :: [[Char]] -> Bool
    scanBoard board 
        | 'r' `elem` board = True
        | 'i' `elem` board = True
        | otherwise = False

谢谢!

2 个答案:

答案 0 :(得分:6)

我们可以创建一个谓词来测试一个字符:

\c -> (c == 'r') || (c == 'i')

然后我们可以检查任何子列表是否有任何这样的char

scanBoard :: [[Char]] -> Bool
scanBoard = any $ any pred where
    pred = \c -> (c == 'r') || (c == 'i')

答案 1 :(得分:2)

出于搜索目的,您可以使用concat将列表列表转换为单个列表,然后使用elem在派生列表中进行搜索,如下所示:

scanBoard :: [[Char]] -> Bool
scanBoard board 
        | elem 'r' $ concat board = True
        | elem 'i' $ concat board = True
        | otherwise = False

或者,我们可以递归地执行此操作,如下所示:

scanBoard :: [[Char]] -> Bool
scanBoard [[]] = False
scanBoard [x] = (elem 'r' x || elem 'i' x)
scanBoard board@(x:xs) = (elem 'r' x || elem 'i' x) || scanBoard xs

这将消除对concat操作的需要,并允许使用模式匹配直接使用列表列表。