list - OCaml 列表类型行为

标签 list types ocaml static-typing

跟随真实世界 OCaml 的章节 error handling ,可以这样构造一个列表:

utop # [ Ok 3; Error "abject failure"; Ok 4] ;;                           
- : (int, string) Result.t list = [Ok 3; Error "object failure"; Ok 4]

但是,我在本文和其他文本中读到“列表的所有元素必须具有相同类型。”

那么 (int, string) Result.t 类型到底是什么?据我所知,这是允许的,因为 OkError 的类型 Result.t 相同。然而,(int, string) 的类似元组的表示法让我感到困惑,如果上面的内容可以接受,为什么这样的东西不也可以呢:

utop # [ Ok 3; Error "abject failure"; Ok "asdf"] ;;              
325 Error: This expression has type string but an expression was expected of type
             int

最佳答案

Result.t 是参数化类型。也就是说,它采用两种类型并将它们形成一种新类型。这与 list 采用一种类型并将其形成新类型的方式相同。

[3;的类型4; 5]int 列表。也就是说,它是一个元素为整数的列表。

同样,类型 (int, string) Result.t 是一个结果,其正确值由整数给出,其错误由字符串给出。

对于给定的 a 和 b 类型选择,像 Ok aError b 这样的值确实是相同的类型。这有点像 Some 3None 是同一类型。

请注意,Result.t 仅采用两种类型,一种用于良好结果,另一种用于错误。最后一个示例的问题在于,您使用两种不同的类型来获得良好的结果。

关于list - OCaml 列表类型行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25376522/

相关文章:

python - 计算两个列表中数字的出现次数并返回一个列表

javascript - getByTitle() 不返回 Sharepoint 列表

python - 列表成员的细节

python - 如何按第二个元素但有条件地对元组列表进行排序

c# - 引用类中的 Self's Type

c++ - dynamic_cast 的正确用例是什么?

haskell - 返回 Haskell 中的特定类型

syntax - Ocaml语法与 bool 值匹配

types - 两条记录的两个字段在 OCaml 中具有相同的标签

windows - Windows 版 OCaml 中的 XML 解析器