首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell中字符串到Morse码的转换

Haskell中字符串到Morse码的转换
EN

Stack Overflow用户
提问于 2020-11-13 13:29:33
回答 1查看 247关注 0票数 0
代码语言:javascript
复制
data Unit = Noise | Silent deriving (Eq, Show)

type MorseCode = [Unit]

short, long, smallGap, longGap :: MorseCode
short = [Noise, Silent]
long = [Noise, Noise, Noise, Silent]
smallGap = replicate (3-1) Silent
longGap = replicate (7-1) Silent

morse :: Char -> MorseCode
morse '0' = long ++ long ++ long ++ long ++ long
morse '1' = short ++ long ++ long ++ long ++ long
morse '2' = short ++ short ++ long ++ long ++ long
morse '3' = short ++ short ++ short ++ long ++ long
morse '4' = short ++ short ++ short ++ short ++ long
morse '5' = short ++ short ++ short ++ short ++ short
morse '6' = long ++ short ++ short ++ short ++ short
morse '7' = long ++ long ++ short ++ short ++ short
morse '8' = long ++ long ++ long ++ short ++ short
morse '9' = long ++ long ++ long ++ long ++ short
morse 'A' = short ++ long
morse 'B' = long ++ short ++ short ++ short
morse 'C' = long ++ short ++ long ++ short
morse 'D' = long ++ short ++ short
morse 'E' = short
morse 'F' = short ++ short ++ long ++ short
morse 'G' = long ++ long ++ short
morse 'H' = short ++ short ++ short ++ short
morse 'I' = short ++ short
morse 'J' = short ++ long ++ long ++ long
morse 'K' = long ++ short ++ long
morse 'L' = short ++ long ++ short ++ short
morse 'M' = long ++ long
morse 'N' = long ++ short
morse 'O' = long ++ long ++ long
morse 'P' = short ++ long ++ long ++ short
morse 'Q' = long ++ long ++ short ++ long
morse 'R' = short ++ long ++ short
morse 'S' = short ++ short ++ short
morse 'T' = long
morse 'U' = short ++ short ++ long
morse 'V' = short ++ short ++ short ++ long
morse 'W' = short ++ long ++ long
morse 'X' = long ++ short ++ short ++ long
morse 'Y' = long ++ short ++ long ++ long
morse 'Z' = long ++ long ++ short ++ short
morse _ = undefined -- Avoid warnings

type Table = [(Char, MorseCode)]

morseTable :: Table
morseTable = [ (c , morse c) | c <- ['A'..'Z']++['0'..'9'] ]

所以我想要创建这个函数

代码语言:javascript
复制
convertStringToMorse :: Table -> String -> MorseCode

我试图使这个函数以一种更一般的方式工作,所以它适用于具有不同表的其他类型的代码。另外,我希望输出在每个字符之间有一个smallGap (三个silent)。

所以

代码语言:javascript
复制
convertStringToMorse morseTable "SKY" =  [Noise, Silent, Noise, Silent, Noise, Silent, Silent, Silent, Noise, Noise, Noise, Silent, Noise, Silent, Noise, Noise, Noise, Silent, Silent, Silent, Noise, Noise, Noise, Silent, Noise, Silent, Noise, Noise, Noise, Silent, Noise, Noise, Noise, Silent]

convertStringToMorse morseTable "Q" = [Noise, Noise, Noise, Silent, Noise, Noise, Noise, Silent, Noise, Silent, Noise, Noise, Noise, Silent]

convertStringToMorse morseTable ""= []

我不太确定在Haskell这样的函数会从哪里开始。

EN

回答 1

Stack Overflow用户

发布于 2020-11-13 13:41:07

您可以使用intercalatelookup来完成这一任务:

代码语言:javascript
复制
import Data.List

convertStringToMorse :: [(Char, MorseCode)] -> String -> Maybe MorseCode
convertStringToMorse table str = intercalate [Silent, Silent, Silent]
    <$> mapM (\x -> lookup x table) str

mapM将把[Maybe MorseCode]转换为Maybe [MorseCode],而<$>则将intercalate函数应用到Maybe的内部。如果你对此感到困惑,请看这里。如果您确实需要一个MorseCode而不是Maybe MorseCode,您可以导入Data.Maybe并将整个函数包装在fromJust中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64821811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档