【问题标题】:How can i use map correctly in Haskell如何在 Haskell 中正确使用地图
【发布时间】:2021-11-20 12:09:47
【问题描述】:

我正在尝试制作一个程序,它接收一个字母并将该字母转换为 摩尔斯电码。 给出了莫尔斯表,还有charToCode :: [(Char, String)] -> Char -> String

我还必须使用 lookupfromJust 表单 Data.Maybe 来完成这项工作。编译后我收到以下错误:

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)

必须使用 Prelude 中的地图。到目前为止,这是我的代码:

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 是一个给定的函数,我也无法对其进行更改。

【问题讨论】:

  • 你不应该使用maplookup a f 的结果是 Maybe String,而不是 Maybe Strings 的列表。
  • @WillemVanOnsem 有没有办法让我的 Maybe String 变成一个只包含一个 Maybe String 元素的列表?然后将其传递给地图

标签: haskell higher-order-functions maybe


【解决方案1】:

您不应使用maplookup 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

【讨论】:

  • 我第一次这样做,但不幸的是我的导师拒绝了,因为我必须以某种方式使用更高的功能。她建议使用地图功能
  • @BarnaMikler:我认为这更多是因为您使用了lookup,并且因为fromJust 被某些人认为不是好的代码设计:如果lookup 找不到任何东西,它会出错。
  • 这里是练习的描述(粗略翻译):“编写一个接受一个字符的函数,并在 morseTab 的帮助下将其转换为莫尔斯电码。您可以假设,该字符在morseTab 表。使用更高的函数(map)。(帮助:在互联网上,查看查找和 fromJust 所做的)charToCode :: [(Char, String)] -> Char -> String"。通过这个我觉得我必须使用地图,查找和 fromJust :/
  • @BarnaMikler:您将需要使用 map 将整个字符串翻译成莫尔斯...
猜你喜欢
  • 1970-01-01
  • 2017-07-26
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
相关资源
最近更新 更多