Похоже, вы пытаетесь реализовать свою собственную версию 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 ,
Вопрос слишком расплывчатый. Какую функцию вы пытаетесь реализовать? – Benesh
Я просто пытаюсь понять, как я могу получить доступ к кортежу. Так что обычно я бы сделал что-то вроде;aFunc :: String -> Bool -> Bool aFunc stringInput aBool = case aBool of ... Я спрашиваю, что бы я разместил в ???? вместо stringInput или aBool для доступа к элементу в списке кортежей. – pmac89
Нет ничего особенного в списке кортежей - вам придется рассматривать аргумент как список, чьи элементы, ну, кортежи :) Мне нужна дополнительная информация для более конкретного ответа. – Benesh