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 中导入函数,但不将其导出给使用者。相反,制作一个传递 Left
和 Right
构造函数的包装器,并导出 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
假设我有一个 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 中导入函数,但不将其导出给使用者。相反,制作一个传递 Left
和 Right
构造函数的包装器,并导出 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