我是Haskell的新手,现在我有一个问题。
如果我有一个列表[[1,2],[3,4],[5,6]]
,并且我想使用像searchList x = 3
这样的函数,那么输出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