Como posso usar o mapa corretamente em Haskell

0

Pergunta

Eu estou tentando fazer um programa, que leva uma carta e transforma a letra em código Morse. O Morse tabela é dado, bem como charToCode :: [(Char, String)] -> Char -> String

Eu também tenho que usar de pesquisa e fromJust Dados do formulário.Talvez para fazer este trabalho. Após a compilação de eu receber o seguinte erro:

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)

Eu tenho para utilizar o mapa do Prelúdio. Aqui é o meu código até agora:

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 é uma função dada, eu não posso fazer alterações para que ele quer.

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

Melhor resposta

1

Você não deve usar map. O resultado de lookup a f é um Maybe String, não uma lista de Maybe Strings.

Você pode usar assim fromJust com:

import Data.Maybe(fromJust)

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

O que está sendo dito, usando fromJust não é seguro: ele não leva em conta que lookup a f pode devolver um Nothing.

2021-11-20 12:14:24

Eu fiz isso a primeira vez, mas o meu mentor recusou-o, infelizmente, porque eu tenho que usar uma maior função de alguma forma. Ela sugeriu a função de mapa
Myxy290

@BarnaMikler: eu acho que é mais porque você usa lookupe porque fromJust é por alguns considerado um bom design de código: vai de erro no caso de lookup não encontrará nada.
Willem Van Onsem

Aqui está a descrição do exercício(traduzido aproximadamente): "Escreva uma função que receba um caractere e com a ajuda de morseTab ele se transforma em código morse. Pode-se supor, que o personagem está em morseTab tabela. Usar uma maior função (mapa). (Ajuda: na internet, veja o que a pesquisa e fromJust fazer) charToCode :: [(Char, String)] -> Char -> String". Por isso eu sinto que eu tenho para utilizar o mapa,pesquisa e fromJust :/
Myxy290

@BarnaMikler: você vai precisar usar o mapa para transformar uma string em morse...
Willem Van Onsem

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................