2015-10-17 103 views
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

回答

3

有一个

lookup :: Eq a => a -> [(a, b)] -> Maybe b 
的序幕

。它返回Maybe,因为您查找的物品可能不在列表中。

但是你没有要求安全,论证顺序与你所问的不同,所以它不能正确回答你的问题

+0

的参数顺序只是一个例子,那的伟大工程,谢谢! – Thomas

+0

@Thomas Aside:如果您还不知道,可以根据他们的(近似)类型签名发现现有功能,这很有趣:https://www.haskell.org/hoogle/ – WhiteViking

+0

哦,我不知道你可以在hoogle上搜索类型签名,这对了解它非常有用! – Thomas

1

正如其他答案所述,您可能希望使用lookup :: Eq a => a -> [(a, b)] -> Maybe bsource-code)。您可以使用lookup key = fmap snd . safeHead . filter ((== key) . fst)这种无点式的方式实现它。

为了在列表中不存在密钥时降低安全性,只需将safeHead :: [a] -> Maybe ahead :: [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) 
+0

哦,这很有趣,效果很好,谢谢! – Thomas

相关问题