我想搜索一个Chars列表的列表,[[Char]]
确定Char是否在列表中,返回true或false。到目前为止,我有这个,
scanBoard :: [[Char]] -> Bool
scanBoard board
| 'r' `elem` board = True
| 'i' `elem` board = True
| otherwise = False
谢谢!
答案 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
操作的需要,并允许使用模式匹配直接使用列表列表。