2014-11-08 2 views
0

Как определить функцию с параметром, являющимся списком кортежей? Так пример ввода будетСписок кортежей как функция Параметр в Haskell

[("hey", False), ("you", True)] 

Моя функция принимает список кортежей, как: [(String, Bool)] Так вот как это выглядит:

aFunc :: [(String, Bool)] -> Bool 
aFunc ???? = 

Так что Я заполняю для ???? чтобы иметь доступ к моему кортежу? Любая помощь будет большой. Благодарю.

Edit:

aFunc :: [(String, Bool)] -> Bool 
aFunc aTuple = mapM_ lookup aTuple? 

Так как мне получить доступ к кортежу в функции? Это не работает.

+0

Вопрос слишком расплывчатый. Какую функцию вы пытаетесь реализовать? – Benesh

+0

Я просто пытаюсь понять, как я могу получить доступ к кортежу. Так что обычно я бы сделал что-то вроде;aFunc :: String -> Bool -> Bool aFunc stringInput aBool = case aBool of ... Я спрашиваю, что бы я разместил в ???? вместо stringInput или aBool для доступа к элементу в списке кортежей. – pmac89

+0

Нет ничего особенного в списке кортежей - вам придется рассматривать аргумент как список, чьи элементы, ну, кортежи :) Мне нужна дополнительная информация для более конкретного ответа. – Benesh

ответ

4

Похоже, вы пытаетесь реализовать свою собственную версию lookup. Вы можете написать простую версию, используя список понимание:

lookup' :: String -> [(String,Bool)] -> Bool 
lookup' k lkp = head $ [v | (k',v) <- lkp, k'==k] 

Или с помощью filter:

lookup'' :: String -> [(String,Bool)] -> Bool 
lookup'' k lkp = snd $ head $ filter ((==k) . fst) lkp 

Обратите внимание, что эти версии являются небезопасными - то есть, они не в состоянии с уродливой и малоинформативной ошибкой, если список не содержит вашу детали:

ghci> lookup' "foo" [("bar",True)] 
*** Exception: Prelude.head: empty list 

Вы можете решить эту проблему, написав собственное сообщение об ошибке:

lookupErr :: String -> [(String,Bool)] -> Bool 
lookupErr k lkp = case [v | (k',v) <- lkp, k'==k] of 
        (v:_) -> v 
        [] -> error "Key not found!" 

Лучший подход к возвращать Maybe Bool вместо:

lookupMaybe :: String -> [(String,Bool)] -> Maybe Bool 
lookupMaybe k lkp = case [v | (k',v) <- lkp, k'==k] of 
        (v:_) -> Just v 
        [] -> Nothing 

версия библиотека принимает этот подход, и имеет более общую подпись:

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

Вы можете прочитать его реализацию here ,

+0

Это на самом деле то, что я искал, но я пытался сам туда добраться. Благодарю. Я очень ценю это. – pmac89

+0

Рад помочь, и извините, если мой ответ был слишком конкретным. Чтение через исходный код ['Data.List'] (http://hackage.haskell.org/package/base-4.7.0.1/docs/src/GHC-List.html) - отличный способ изучить основы Haskell. Он содержит множество простых функций, реализованных в элегантном стиле и является отличным источником для хороших привычек Haskell :) – Benesh

Смежные вопросы