允許我解釋我的問題是否不清楚。假設我有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