List Haskell——尝试将字符串拆分为特定字符集上的字符串列表
我正在努力将一个字符串分解为一个字符串列表(这是一个更大问题的一部分),我相信我正在努力,因为我无法完全掌握如何使用Haskell中的嵌套列表 需要注意的是,我对这个问题的一般方法可能是错误的,我可以考虑修改PreludeList Haskell——尝试将字符串拆分为特定字符集上的字符串列表,list,haskell,List,Haskell,我正在努力将一个字符串分解为一个字符串列表(这是一个更大问题的一部分),我相信我正在努力,因为我无法完全掌握如何使用Haskell中的嵌套列表 需要注意的是,我对这个问题的一般方法可能是错误的,我可以考虑修改Preludewords函数,但我想先了解我做错了什么,然后再优化它,这样我才能修正我的理解。字符串是“..-..-..-..” 当在列表中找到三个连续的空格时,我试图分隔字符串。我已经尝试设置基本递归来实现这一点,但我正在努力构建嵌套子列表。我一直在兜圈子,所以任何提示都将不胜感激 我现在
words
函数,但我想先了解我做错了什么,然后再优化它,这样我才能修正我的理解。字符串是“..-..-..-..”
当在列表中找到三个连续的空格时,我试图分隔字符串。我已经尝试设置基本递归来实现这一点,但我正在努力构建嵌套子列表。我一直在兜圈子,所以任何提示都将不胜感激
我现在的代码是
decodeMorse :: String -> [String]
decodeMorse [] = []
decodeMorse (' ':' ':' ':xs) = [] : decodeMorse xs
decodeMorse (x:xs) = [x] : decodeMorse xs
这将返回字符串列表,但格式如下:
当我希望在这三个空间上构造字符串时
提前感谢您提供的任何帮助您应该预先准备递归调用的第一项,以便:
decodeMorse :: String -> [String]
decodeMorse "" = []
decodeMorse ss = go ss
where go [] = [[]]
go (' ':' ':' ':xs) = [] : decodeMorse xs
go (x:xs) = let ~(y:ys) = go xs in (x:y) : ys
不过,最好使用一个解析器库,您可以在其中指定莫尔斯语法,这通常更有效,因为它可以通过遍历一次列表来转换一系列标记中的字符串。ooh那是什么~(y:ys)
syntax?@AdamSmith:这是一种无可辩驳的模式:如果我们打算拆分无限列表,这是必要的,因为这样我们就永远不会真正得到(y:ys)
的结果。这意味着我们确信它将符合这种模式。消除GHC关于不完整模式的警告也是很有用的。这很有趣,很有意义,所以感谢您的回复。抱歉,没有尽快回复您,但这确实有帮助!我没有使用模块的唯一原因是因为这项工作是为了准备考试,我们不能使用模块;只是想加深我的理解
Prelude> decodeMorse ".... . -.-- .--- ..- -.. ."
[".... . -.--",".--- ..- -.. ."]