Haskell: поиск второго значения кортежа в списке на основе первого значения - PullRequest
3 голосов
/ 02 мая 2009

У меня есть функция, которая предназначена для просмотра списка кортежей и поиска второго значения в кортеже, принимая первое значение. Вот функция до сих пор:

lookup :: String -> [(String,String)] -> String
lookup _ _ [] = "Not found"
lookup x y zs = if (notFound x zs)
    then "Not found"
    else (head [b | (a,b) <- zs, (a==x)])

Функция notFound просто возвращает Bool как true, если нет кортежа, содержащего данную первую строку. Проблема в том, что я получаю эту ошибку типа в Hugs:

ERROR "find.hs" (line 22): Type error in explicitly typed binding
*** Term           : lookup
*** Type           : String -> [(String,String)] -> [a] -> String
*** Does not match : String -> [(String,String)] -> String

Я думаю, что это как-то связано с фиктивным значением "Не найдено", имеющим тип, отличный от строки из сгенерированного списка, но я не уверен.

Ответы [ 3 ]

6 голосов
/ 02 мая 2009

кстати, вы знали, что в Haskell Prelude уже есть функция поиска для поиска записей в списке ассоциаций? вот сигнатура типа (она более общая, она принимает любой тип ключа, экземпляр которого равен Eq):

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

чтобы ваша функция выполняла что-то вроде ниже

myLookup x zs = Maybe.fromMaybe "Not found" $ lookup x zs
6 голосов
/ 02 мая 2009

Я думаю, что ваше явное объявление типа неверно. У вас есть:

lookup :: String -> [(String,String)] -> String

но я думаю, что это должно быть

lookup :: String -> String -> [(String,String)] -> String

На самом деле, после еще одного взгляда на это, похоже, что вы не используете второй параметр "у". Таким образом, вы можете удалить его и подчеркивание, как это

lookup :: String -> [(String,String)] -> String
lookup _ [] = "Not found"
lookup x zs = if (notFound x zs)
  then "Not found"
  else (head [b | (a,b) <- zs, (a==x)])

Это позволит вам сохранить объявление типа, которое у вас есть.

1 голос
/ 02 мая 2009

На первый взгляд, похоже, что второй параметр следует удалить (знак «у» и второй знак подчеркивания)? объявлено, что поиск имеет два параметра, а не три.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...