【问题标题】:ReasonML sample web server with a dbReasonML 带有 db 的示例 Web 服务器
【发布时间】:2018-08-18 19:21:19
【问题描述】:

我一直在研究 ReasonML (https://reasonml.github.io/),总的来说,作为一个“忠诚的”;) 函数式程序员,我喜欢这个想法。但是,我相信我对这个项目的推理中缺少一部分。

特别是如果要搜索什么,我会感到有些困惑。例如,我想构建一个简单的 Web 服务器。我应该使用与 JS 相关的库(express、...)、OCaml 技术还是其他什么?

我实际上缺少的是一个分步指南,它提供了一种构建完整基本应用程序的方法(在这种情况下:假设是一个带有数据库连接的简单 Web 服务器)。

最后一件事 - 请原谅我不准确的语言。正如我所说:我很确定我对 ReasonML 的推理存在空白,我想填补它;)。

【问题讨论】:

标签: database webserver reason


【解决方案1】:

如果你想编写可移植的代码,你应该使用OCaml 技术,所以Array.length(来自OCaml 核心)而不是Js.Array.length(Bucklescript JS 包装器)。

如果您不关心原生代码,而只想针对 JS(节点/浏览器),那么您可以使用 FFI 并利用您现有的 JS 库知识。

恕我直言,这个 FFI 是 reasonML 的优点之一。生成的代码很小,您可以检查 .bs.js 文件以查看它在做什么。

但如前所述,您将失去以这种方式生成本机代码的能力。


这是一个例子,

https://github.com/wires/reason-ffi

假设我在 OCaml 或 ReasonML 中没有 range 函数,我不想写一个,但我知道 ramda 有一个。随便写点JS,

// range.js
exports.range = require('ramda').range

然后用类型包装它,比如

[@bs.module "./range.js"] external range' : (int,int) => array(int) = "range";
let range : (int,int) => list(int) = (a,b) => range'(a,b) |> Array.to_list

我并不是说这是使用此工具的终极方式,但我发现这是一种将无类型垃圾 JS 转换为可合理维护的东西的非常顺畅的方式。

您可以利用现有的 JS 库知识并继续使用 reasonML 进行构建,而不是花时间编写无聊的 range 函数(当然,这也是学习...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多