首页 > 解决方案 > 将自定义类型转换为“选项”自定义类型

问题描述

我是 Ocaml 和函数式编程的新手,我正在尝试实现一些尊重某些组件接口的数据结构。目前我是以下错误的问题

File "src/symbol_table.ml", line 24, characters 39-45:
24 |   { variables=Hashtbl.create 0; parent=Option(table) }
                                            ^^^^^^
Error: This variant expression is expected to have type dec option
       The constructor Option does not belong to type option
Command exited with code 2.

我正在尝试实现以下接口

type dec

val begin_block : dec -> dec

通过以下实现

type dec = {
  variables: (Ast.identifier, Ast.typ) Hashtbl.t;
  parent: dec option
}

let begin_block (table: dec) =
  logger#debug "Starting scope";
  { variables=Hashtbl.create 0; parent=table }

我认为我的 Java 知识是这里的限制,我的问题是如何进行强制转换以键入 dec 选项?将表设置为父级?

标签: ocaml

解决方案


OCaml 中的Anoption是一种变体,可以包含以下两种情况之一:

  • 要么是一个表示有内容的值,要么是什么值,请注意Some(value)
  • 要么是表示没有内容的值,请注意None

所以 adec option是一种类型,它是一个可以保存dec值的选项。要么它有一个值 usingSome要么它没有一个值 using None

要回答您的问题,您需要替换parent=tableparent=Some(table).

如果您想表示没有父母,您将拥有parent=None.

我强烈建议您阅读变体和OptionOCaml,因为它们是该语言非常有用的强大功能。

这里有更多关于Option这个线程中的内容的解释


推荐阅读