Haskell:搜索列表

时间:2014-05-31 20:24:41

标签: haskell

我是Haskell的新手,现在我有一个问题。 如果我有一个列表[[1,2],[3,4],[5,6]],并且我想使用像searchList x = 3这样的函数,那么输出4,如何与它结合使用?

4 个答案:

答案 0 :(得分:3)

使用filter高阶函数:

search :: [[Int]] -> Int -> Int
search list n = head (head (filter (\(x:xs) -> x == n) list))

这个search函数的作用是过滤传递的列表列表的元素,只选择那些传递值为n的列表。然后只需要一个(第一个,这就是使用第一个(右)head的原因),然后提取该列表的第一个元素(再次使用head)。

如果你想存储一对配对列表,我建议你使用元组而不是列表作为列表的元素。

编辑:正如人们在评论中建议的那样,如果你使用元组,那么在前奏中有一个函数lookup来实现这种搜索。

答案 1 :(得分:1)

那么你有一个列表列表,你想搜索它,找到匹配[x,y]的元素并返回y。

searchList x (y:ys) = if x == head y then last y else searchList x ys
searchList x [] = -1

其行为如下:

Main> :load searchlist.hs 
Main> searchList 3 [ [1, 2], [3, 4], [5, 6] ]
4
Main> searchList 5 [ [1, 2], [3, 4], [5, 6] ]
6
Main> searchList 6 [ [1, 2], [3, 4], [5, 6] ]
-1

另外,如果你想要一个固定的宽度,比如列表中的对,那么在Haskell中使用列表并不常见。使用元组列表会更像是Haskell-ish。

searchListTuples x (y:ys) = if x == fst y then snd y else searchListTuples x ys
searchListTuples x [] = -1

当然,行为非常相似:

Main> searchListTuples 3 [ (1,2), (3,4), (5,6) ]
4
Main> searchListTuples 5 [ (1,2), (3,4), (5,6) ]
6
Main> searchListTuples 6 [ (1,2), (3,4), (5,6) ]
-1

答案 2 :(得分:0)

尝试:

searchList x y = last $ head $ dropWhile (\[a,_]->a/=x) y

或者,以无点符号表示:

searchList = ((last . head) .) . dropWhile . (. head) . (/=)

答案 3 :(得分:0)

我喜欢这个递归函数,但是" -1"因为一个坏的值不是正常的Haskell成语。使用别。

searchListTuples x (y:ys) = if x == fst y then Just (snd y) else SearchListTuples x ys
searchListTuples x [] = Nothing