带有数据库的 ReasonML 示例 Web 服务器

ReasonML sample web server with a db

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

特别是对于要搜索的内容,我有点困惑。例如,我想构建一个简单的 Web 服务器。我应该使用与 JS 相关的库(express,...)、OCaml 技术,还是其他东西?

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

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

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

如果您不关心本机代码,而只想以 JS (node/browser) 为目标,那么您可以使用 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 函数(这也是学习......当然)