list - 在 Ocaml 中将字符串拆分为单词字符列表

标签 list ocaml morse-code

所以,我有作业,我正在尽力解决它。 我们必须将英语翻译成摩尔斯电码。 每个词都必须分开。

示例:如果我输入this is,它应该写:["_";"....";"..";"..."]["。 .";"...."]

到目前为止,我编写了 2 个函数(小写到大写,并用摩尔斯电码匹配字母和数字),现在我需要编写将字符串转换为字符列表的函数,如下所示:

stringSAllCaps "   ban an  a  ";;
- : char list list = [['B'; 'A'; 'N']; ['A'; 'N']; ['A']]
stringSAllCaps "banana";;
- : char list list = [['B'; 'A'; 'N'; 'A'; 'N'; 'A']]

我知道如何将字符串转换为字符列表,但不知道下一步该怎么做。我不需要有人为我完全解决这个问题,只是引导我走向正确的方向。

这就是我所做的:

let explode niz =
  let rec exp a b =
    if a < 0 then b 
    else exp (a - 1) (niz.[a] :: b) in
  exp (String.length niz - 1) []
     ;;

编辑:

感谢您的帮助:) 我已经设法解决了这个问题,但不是这样的。我稍后会发布。 当我解决它并继续做作业时,我意识到我必须使用 whilepointers 现在我又陷入困境了(指针不是我最好的 friend ..) 。有什么建议吗?

我目前的解决方案:

# let explode str =
let rec exp = function
| a, b when a < 0 -> b
| a, b -> exp (a-1, str.[a]::b)
in
exp ((String.length str)-1, []);;
# let split lst ch =
let rec split = function
| [], ch, cacc', aacc' -> cacc'::aacc'
| c::lst, ch, cacc', aacc' when c = ch -> split (lst, ch, [], cacc'::aacc')
| c::lst, ch, cacc', aacc' -> split (lst, ch, c::cacc', aacc')
in
split (lst, ch, [], []);;

最佳答案

我想你应该从以下开始:

  • 重命名递归函数的参数,使其具有更明确的含义(例如 indexcurrent_word)
  • 在递归函数中添加一个新参数来存储已经看到的单词 (seen_words)
  • 测试niz.[a]是否是一个空白字符,如果是的话就做正确的事情,即。更新当前单词或已经看到的单词列表。

关于list - 在 Ocaml 中将字符串拆分为单词字符列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10258743/

相关文章:

c++ - 单词之间的摩尔斯电码空格问题

c++ - 独特的结构列表

html - 列表项元素符号点重复

function - 为什么一个参数 Ocaml 函数可以使用两个参数

在c中将摩尔斯电码转换为英语

python - 更新字典值中的列表

python - 数组解释的循环旋转

ocaml - 如何在 Ocaml 中将非内置类型转换为字符串?

f# - F# 中是否存在与 DU 的 [<RequireQualifiedAccess>] 属性等效的 OCaml?