Haskell:在元组列表中查找第一个元素为 x 的元组
Haskell: Find tuple with first element x in list of tuples
如果我的问题不清楚,请允许我解释一下。假设我有 tuples :: [(a, Int)]
。我使用 zip
创建了这个。现在,我想为我的 a
元素找到相应的 Int
值。我想弄清楚我是怎么做到的。
f :: [(a, Int)] -> a -> Int
以上是我需要的函数类型
或者在ghci中需要如何使用:
let tuples = zip ['a','b','c'] [1..]
f tuples 'a'
returns: 1
有一个
lookup :: Eq a => a -> [(a, b)] -> Maybe b
在序曲中。它 returns 一个 Maybe
因为您正在查找的项目可能不在列表中。
但是你并没有要求安全,而且参数顺序与你所要求的不同,所以它没有准确地回答你的问题。
正如其他答案所说,您可能希望使用 lookup :: Eq a => a -> [(a, b)] -> Maybe b
(source-code)。您可以以无点样式实现它,如 lookup key = fmap snd . safeHead . filter ((== key) . fst)
.
要在列表中不存在密钥时降低安全性,只需将 safeHead :: [a] -> Maybe a
替换为 head :: [a] -> a
,并简单地更改参数顺序 flip :: (a -> b -> c) -> b -> a -> c
.
因此,要找到您的初始规格,我们可以:
myLookup :: Eq a => [(a, b)] -> a -> b
myLookup = flip myLookup'
where myLookup' key = snd . head . filter ((== key) . fst)
如果我的问题不清楚,请允许我解释一下。假设我有 tuples :: [(a, Int)]
。我使用 zip
创建了这个。现在,我想为我的 a
元素找到相应的 Int
值。我想弄清楚我是怎么做到的。
f :: [(a, Int)] -> a -> Int
以上是我需要的函数类型
或者在ghci中需要如何使用:
let tuples = zip ['a','b','c'] [1..]
f tuples 'a'
returns: 1
有一个
lookup :: Eq a => a -> [(a, b)] -> Maybe b
在序曲中。它 returns 一个 Maybe
因为您正在查找的项目可能不在列表中。
但是你并没有要求安全,而且参数顺序与你所要求的不同,所以它没有准确地回答你的问题。
正如其他答案所说,您可能希望使用 lookup :: Eq a => a -> [(a, b)] -> Maybe b
(source-code)。您可以以无点样式实现它,如 lookup key = fmap snd . safeHead . filter ((== key) . fst)
.
要在列表中不存在密钥时降低安全性,只需将 safeHead :: [a] -> Maybe a
替换为 head :: [a] -> a
,并简单地更改参数顺序 flip :: (a -> b -> c) -> b -> a -> c
.
因此,要找到您的初始规格,我们可以:
myLookup :: Eq a => [(a, b)] -> a -> b
myLookup = flip myLookup'
where myLookup' key = snd . head . filter ((== key) . fst)