2015-10-17 151 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

相關問題