跟随真实世界 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
类型到底是什么?据我所知,这是允许的,因为 Ok
和 Error
的类型 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 a
和 Error b
这样的值确实是相同的类型。这有点像 Some 3
和 None
是同一类型。
请注意,Result.t
仅采用两种类型,一种用于良好结果,另一种用于错误。最后一个示例的问题在于,您使用两种不同的类型来获得良好的结果。
关于list - OCaml 列表类型行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25376522/