2015-10-26 3 views
0

Я только что начал с Haskell и должен решить следующую задачу.Возможно Int Int Int от findIndex со строками

У меня есть список, который содержит дни недели, и мне нужен индекс, соответствующий месту нахождения значения st, если он находится в списке:

weekdays = ["Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag"] 

findIndex(==st)weekdays 

Мой код работает до сих пор, что я получаю Just 3 для пример. Тем не менее, я читал, что это Maybe Int, и мне нужно только номер из него.

Итак, я добавил функцию eliminate:

eliminate :: Maybe Int -> Int 
eliminate (Just a) = a 

Но если я использую eliminate findIndex(==st)weekdays он не работает и ошибка:

*** Expression  : eliminate findIndex (flip (==) st) weekdays 
*** Term   : eliminate 
*** Type   : Maybe Int -> Int 
*** Does not match : a -> b -> c -> d 

И я не могу понять способ идти отсюда, так как я новичок.

Может кто-нибудь помочь мне? К сожалению, код должен работать на Hugs98.

+0

Остерегайтесь, что ваша программа будет разбиваться ужасно, как только вы будете искать имя с ошибкой. – chi

+0

его просто часть кода, я позаботился об этом.Но спасибо, что указали это =) – LoWesT

ответ

2

Обратите внимание, что ошибка типа, сообщаемая Hugs, относится к ассоциативности и приоритету применения функции. Ваше выражение

eliminate findIndex (== st) weekdays 

попытки применить eliminate к findIndex первым, который не является целью вашего кода. Я думаю, что вы действительно хотите сделать это:

eliminate (findIndex (== st) weekdays) 

или

eliminate $ findIndex (== st) weekdays 

Эти и применяются eliminate к результату findIndex (== st) weekdays. Это должно проверить тип, как и ожидалось.

Но в ответ на ваш вопрос о том, как бороться с значением Maybe: вы можете использовать fromJust или fromMaybe для извлечения содержащегося значения.

Ссылки идут на текущие документы GHC, но должны быть эквивалентные функции Hugs.

Подсказка для использования в будущем: вы можете искать документацию Haskell онлайн, используя Hoogle. Лучше всего, что вы можете искать как по имени функции, так и по типу. Например, поиск по Maybe a -> a нашел бы обе эти функции.

Другой подход заключается в модельную матча на Nothing, а также Just a:

eliminate (Just a) = -- Handle a 
eliminate Nothing = -- Handle error case 

Конечно, вы должны решить, что eliminate следует оценивать в случае ошибки.

+0

Спасибо, работал просто отлично =) – LoWesT

+0

@LoWesT: Я добавил больше комментариев о приоритете исходного выражения, чтобы объяснить исходную ошибку компилятора, которую вы наблюдали. –

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