如何使用OCaml/Reason在模块中创建内部值

4

我有以下模块:

type userBuilderType = {
  mutable name: string,
};

module BuilderPattern = {
  let builder () => {
    name: "",
  };
  let setName = fun name => builder.name = name;
  let getName = builder.name;
};

BuilderPattern.setName("Charles");
Js.log(BuilderPattern.getName);

它实现了以下功能:
  1. 为setter创建类型
  2. 创建builderName对象用于设置和获取 此外,我还想:
  3. 能够通过在getName函数上使用JS.log来检索名称

但是,在这种情况下,我会收到以下错误:

This is: unit => userBuilderType But somewhere wanted: userBuilderType 

非常感谢您能够提供有关如何正确设置setter/getter的任何建议。谢谢。


1
{btsdaf} - gallais
{btsdaf} - Charlie-Greenman
{btsdaf} - Charlie-Greenman
1
{btsdaf} - Rob
{btsdaf} - Charlie-Greenman
显示剩余2条评论
1个回答

2
你的问题代码存在许多问题,其中一些仅限于语法。Github上的代码更加有意义,但你面临的主要问题是没有在任何地方创建数据实例。
我认为这就是你想要的,这里需要构建实例并将其传递给getter和setter:
type userBuilderType = {
  mutable name: string,
  mutable age: int,
  mutable phone: string,
  mutable address: string
};

module BuilderPattern = {
  let builder () => {
    name: "",
    age: 0,
    phone: "",
    address: ""
  };
  let setName builder name => builder.name = name;
  let getName builder => builder.name;
};

let myBuilder = BuilderPattern.builder ();

BuilderPattern.setName myBuilder "Charles";
Js.log(BuilderPattern.getName myBuilder);

但这似乎也是您意图的一种有效解释,其中状态被全局保留(这通常是一个非常非常糟糕的想法):

type userBuilderType = {
  mutable name: string,
  mutable age: int,
  mutable phone: string,
  mutable address: string
};

module BuilderPattern = {
  let builder = {
    name: "",
    age: 0,
    phone: "",
    address: ""
  };
  let setName name => builder.name = name;
  let getName () => builder.name;
};

BuilderPattern.setName "Charles";
Js.log(BuilderPattern.getName ());

在这两种情况下,问题归结为以各种方式混淆接受单个单位参数的函数和仅仅是一个let绑定。

我一如既往地感谢您。事实上,我的问题是对单元类型的误解。尽管类似于C++中的void,但在OCaml中有些独特。上述链接以及https://reasonml.github.io/guide/language/function/ + http://ocaml.org/learn/tutorials/basics.html 对我非常有帮助。我再次表示衷心的感谢。 - Charlie-Greenman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接