我很难将字符串分解为字符串列表(这是一个更大问题的一部分(,我相信我很难,因为我无法完全掌握如何在Haskell中使用嵌套列表。
需要注意的是,我对这个问题的一般方法可能是错误的,我可以考虑更改Preludewords
函数,但在优化它之前,我想先了解我做错了什么,这样我就可以修复我的理解。字符串为".... . -.-- .--- ..- -.. ."
当在列表中找到三个连续的空格时,我正试图分离字符串。我尝试过设置基本的递归来实现这一点,但我很难构建嵌套的子列表。我一直在兜圈子,所以任何建议都将不胜感激!
我当前的代码是
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
这里CCD_ 4因此是第一个子列表,因此我们用CCD_。
然后产生:
Prelude> decodeMorse ".... . -.-- .--- ..- -.. ."
[".... . -.--",".--- ..- -.. ."]
然而,使用可以指定Morse语法的解析器库可能会更好,这通常更有效,因为它可以通过遍历列表一次来转换令牌序列中的字符串。