string - OCaml 测试字符串是否几乎为空或包含关键字

标签 string algorithm ocaml keyword

我在 OCaml 中遇到了问题,我目前正在学习它,但我仍然是一个新手。我想制作一个函数,如果字符串为空或仅包含空格,则返回 true 并同时删除 beginend 的任何出现。

我已经试过了:

let isEmptyString s =  
  let rec empty i =
    if i < 0 then true
    else
          let c = String.get s i in
          if c = ' ' || c = '\009' then empty (pred i)
          else false
  in
  s = Str.global_replace( Str.regexp "begin") "" s;
  s = Str.global_replace( Str.regexp "end") "" s;
  empty (pred (String.length s))

但很明显,这个函数并没有像我希望的那样工作,因为我在调用它之后仍然在 Formula.importNrAgentsFormula 中获得 begin ......这是我的方法调用它:

while true do
   let input = read_line () in
   if not (isEmptyString input) then
      let (nr, f) = Formula.importNrAgentsFormula input in
      incr counter;
      flush stdout;
      match choice with
       | "graph" -> printRes (Graph.isSat ~verbose:verb nr f)
       | _ -> printUsage ()
   else ()
done

如果有更多 OCaml 经验的人能够发现错误并向我解释,我将很高兴 :)

提前致谢

最好的问候。

最佳答案

我建议你让你的函数 isEmptyString(isBlankString 而不是?)做它应该做的(只是检查它是否只包含空格或什么都不包含),它应该不修改原始字符串。您可以在循环中执行此操作:

while true do
   let input = read_line () in
   let input = Str.global_replace( Str.regexp "begin") "" input in
   let input = Str.global_replace( Str.regexp "end") "" input in
   if not (isEmptyString input) then
   ...

编辑:很抱歉编辑晚了,这里有一些关于你的错误的额外信息:

如果您在 OCaml 中运行您的函数,您将看到此警告:

Warning 10: this expression should have type unit.

s = Str.global_replace( Str.regexp "begin") ""s; 这行。这是因为 OCaml 中的 = 运算符在这种情况下不是赋值运算符,而是相等运算符,所以在这一行中,您只需比较两个值并返回一个 bool 值。由于 OCaml 期望 e1;e2 中的 e1 返回 unit,因此您会收到此警告。

在 OCaml 中,变量的值是不可变的,因此您可以:

  • 按照@Jason 的建议使用另一个变量:let t = Str.global_replace( Str.regexp "begin") ""s
  • 按照我上面的建议“隐藏”旧值:let s = Str.global_replace( Str.regexp "begin") ""s
  • 使用引用(指向内存中某个位置的指针):let s = ref "before"in s := "after",然后您可以使用!运算符:!s。但是,如果你正在学习函数式编程,我建议你一开始就尽量不要使用 OCaml 的任何命令式特性来发现这种新范式及其可能性。

关于string - OCaml 测试字符串是否几乎为空或包含关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37656436/

相关文章:

php - 如何使用php从字符串中删除重复的单词?

python : Counting execution of recursive call

lambda - 为什么`id id`在OCaml中不是值?

c - 混合 OCaml 和 C : is it worth the pain?

c++ - 寻找一种有效的数据结构来进行快速搜索

encoding - ocaml 将字符串 UTF8 转换为 CP1251

c# - C#中的大写句子

regex - 如何检测python字符串中的最后一位数字

string - 使由 '{' 、 '}' 、 '[' 、 ']' 、 '(' 、 ')' 组成的括号字符串的最小加法有效

algorithm - 良好的图形/复杂网络库