purescript - 建模一个抛出异常的函数

purescript - modelling a function which throws an exception

假设我有一个 Javascript 函数 f 抛出异常。

我想在 Purescript 端将其公开为

foreign import f :: a -> Either e b

其中 e 是抛出异常的类型。

我可以通过捕获异常并用 Either 的构造函数包装 f 的结果来实现这一点,但这似乎是一个肮脏的解决方案,因为我会在 [=] 上使用 Purescript 数据构造函数25=]边。

是否有更好或更标准的解决方案?

从 JavaScript 构建 PureScript 数据的常用方法是将构造函数作为函数传入。您的 JS 函数需要额外的两个参数:

// JavaScript
exports.f_ = left => right => a => {
    try { return right(whatever(a)); }
    catch(e) { return left(e); }
}

然后在 PureScript 中导入函数,但不将其导出给使用者。相反,制作一个传递 LeftRight 构造函数的包装器,并导出 that:

-- PureScript
module MyModule(f) where

foreign import f_ :: forall a b e. (e -> Either e b) -> (b -> Either e b) -> a -> Either e b

f :: forall a e b. a -> Either e b
f = f_ Left Right