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'] ]所以我想要创建这个函数
convertStringToMorse :: Table -> String -> MorseCode我试图使这个函数以一种更一般的方式工作,所以它适用于具有不同表的其他类型的代码。另外,我希望输出在每个字符之间有一个smallGap (三个silent)。
所以
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这样的函数会从哪里开始。
发布于 2020-11-13 13:41:07
您可以使用intercalate和lookup来完成这一任务:
import Data.List
convertStringToMorse :: [(Char, MorseCode)] -> String -> Maybe MorseCode
convertStringToMorse table str = intercalate [Silent, Silent, Silent]
<$> mapM (\x -> lookup x table) strmapM将把[Maybe MorseCode]转换为Maybe [MorseCode],而<$>则将intercalate函数应用到Maybe的内部。如果你对此感到困惑,请看这里。如果您确实需要一个MorseCode而不是Maybe MorseCode,您可以导入Data.Maybe并将整个函数包装在fromJust中。
https://stackoverflow.com/questions/64821811
复制相似问题