list - OCaml:List.iter 从匹配后的下一个元素开始

标签 list functional-programming ocaml

我发现了一个奇怪的事情:

在我的代码中,我想输出一个包含特殊类型元素的列表的数据,该元素由另一种类型和 name 组成。

我以前从来不需要这样的代码,所以我不知道为什么它不起作用或者它被禁止或类似的东西。

List.iter(
    fun x -> (
        fprintf oc "(";
        fprintf oc "asdf";
        match x.kind with
        |Id -> fprintf oc "Id"
        |Op -> fprintf oc "Op"
        |Test -> fprintf oc "Test"
        ;  
        fprintf oc "fdsa";
        fprintf oc "%s" x.name;
        fprintf oc "),";
    )   
)list;

asdf 和 fdsa 是测试输出,用于查看问题出在哪里。 oc 是我写入文件的输出 channel ,其余的对于像你这样的 Ocaml-Pros 应该是安静的 self 解释:)

不幸的是,我只得到这样的结果: (asdfId(asdfOp(asdfId,所以看起来,执行在匹配后停止,他继续列表的下一个元素。

预期的输出将是(asdfIdfdsatest1),(asdfOpfdsatest2)...

我不能只将 x.name 移到顶部,因为我需要右括号

我做错了什么,我错过了一个错误吗?有谁知道如何输出我的数据?

最佳答案

在 OCaml 中,match; 具有更高的优先级。因此,您需要将 match 括在一对括号中。

让我们在顶层尝试以下操作:

> match 0 with
   | 0 -> print_string "zero "
   | _ -> print_string "non-zero";
  print_endline "42";;

Output: zero 

现在让我们在 match 表达式周围添加括号:

> (match 0 with
   | 0 -> print_string "zero "
   | _ -> print_string "non-zero");
  print_endline "42";;

Output: zero 42

旁注:在现实生活中,最好使用 if 表达式对整数进行那种“模式匹配”。

关于list - OCaml:List.iter 从匹配后的下一个元素开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37585404/

相关文章:

list - 如何显示在 Emacs 中 hippie-expand 命令创建的所有可能的补全?

python - 尝试编写 For-While 循环,但不起作用

ocaml - 此OCaml代码有什么问题?

package - Ocaml:使用 opam 从我的沙丘项目中的 Git 加载外部库

java - 处理中的列表<String>

visual-studio - 创建 SharePoint 2013 查找列表列 Visual Studio 2012 列表设计器

user-interface - Haskell 中实现了哪些事件驱动的应用程序?

java - 我的整数列表在哪里变成了可选<Integer>列表?

scala - 为什么这个Option要转换成String? [斯卡拉]

emacs - 如何下载和安装 OCaml 的 Emacs?