允许我解释我的问题是否不清楚。假设我有tuples :: [(a, Int)]
。我使用zip
创建了这个。现在,我想为我的a
元素找到相应的Int
值。我试图弄清楚我是如何做到这一点的。Haskell:在元组列表中找到第一个元素x的元组
f :: [(a, Int)] -> a -> Int
以上是我需要的函数的类型。
或者它如何需要ghci中使用:
let tuples = zip ['a','b','c'] [1..]
f tuples 'a'
回报:1
允许我解释我的问题是否不清楚。假设我有tuples :: [(a, Int)]
。我使用zip
创建了这个。现在,我想为我的a
元素找到相应的Int
值。我试图弄清楚我是如何做到这一点的。Haskell:在元组列表中找到第一个元素x的元组
f :: [(a, Int)] -> a -> Int
以上是我需要的函数的类型。
或者它如何需要ghci中使用:
let tuples = zip ['a','b','c'] [1..]
f tuples 'a'
回报:1
有一个
lookup :: Eq a => a -> [(a, b)] -> Maybe b
的序幕
。它返回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)
哦,这很有趣,效果很好,谢谢! – Thomas
的参数顺序只是一个例子,那的伟大工程,谢谢! – Thomas
@Thomas Aside:如果您还不知道,可以根据他们的(近似)类型签名发现现有功能,这很有趣:https://www.haskell.org/hoogle/ – WhiteViking
哦,我不知道你可以在hoogle上搜索类型签名,这对了解它非常有用! – Thomas