Как я могу правильно использовать карту в Haskell

0

Вопрос

Я пытаюсь создать программу, которая берет букву и превращает эту букву в азбуку Морзе. Приведена таблица Морзе, а также charToCode :: [(Char, String)] -> Char -> String

Я также должен использовать поиск и только данные формы.Может быть, чтобы это сработало. При компиляции я получаю следующую ошибку:

Couldn't match expected type [Maybe Char]
            with actual type Maybe String
    * In the second argument of 'map', namely '(lookup a f)'
      In the expression: map (fromJust) (lookup a f)
      In an equation for 'charToCode':
          charToCode f a = map (fromJust) (lookup a f)

Я должен использовать карту из Прелюдии. Вот мой код до сих пор:

morseTab :: [(Char, String)]
morseTab = [('A', ".-"), ('B', "-..."), ('C', "-.-."), ('D', "-.."), ('E', "."), ('F', "..-."), ('G', "--."), ('H', "...."),('I', ".."), ('J', ".---"), ('K', "-.-"), ('L', ".-.."), ('M', "--"), ('N', "-."), ('O', "---"), ('P', ".--."), ('Q', "--.-"), ('R', ".-."), ('S', "..."), ('T', "-"), ('U', "..-"), ('V', "...-"), ('W', ".--"), ('X', "-..-"), ('Y', "-.--"), ('Z', "--..")]
charToCode :: [(Char, String)] -> Char -> String
charToCode f a = map (fromJust) (lookup a f)

morseTab-это заданная функция, я тоже не могу вносить в нее изменения.

haskell higher-order-functions maybe
2021-11-20 12:09:47
1

Лучший ответ

1

Вы не должны использовать map. Результат lookup a f это Maybe String, а не список Maybe Strings.

Таким образом, вы можете использовать fromJust с:

import Data.Maybe(fromJust)

charToCode :: [(Char, String)] -> Char -> String
charToCode f a = fromJust (lookup a f)

Тем не менее, используя fromJust небезопасно: это не учитывает, что lookup a f может вернуть Nothing.

2021-11-20 12:14:24

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

@BarnaMikler: я думаю, это больше потому, что вы используете lookup, и потому что fromJust по некоторым не считается хорошим дизайном кода: это приведет к ошибке в случае lookup ничего не находит.
Willem Van Onsem

Вот описание упражнения(примерно переведенное): "Напишите функцию, которая принимает символ и с помощью morseTab превращает его в азбуку Морзе. Вы можете предположить, что символ находится в таблице morseTab. Используйте более высокую функцию (карту). (Справка: в Интернете посмотрите, что нужно сделать для поиска и от) charToCode :: [(Символ, строка)] -> Символ ->> Строка". Этим я чувствую,что мне нужно использовать карту, поиск и просто :/
Myxy290

@BarnaMikler: вам нужно будет использовать map для перевода всей строки на азбуку Морзе...
Willem Van Onsem

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................