PureScript 等同于 Haskell prelude 中的‘error’

PureScript equivalent to ‘error’ from Haskell prelude

我是 PureScript 的新手,正在尝试找到“断言失败”的成语。我通常在以下情况下使用它来停止执行:

在 Haskell 中,我通常会使用前奏函数 error 来处理这种事情。在 PureScript 中,我(天真地)期望能够通过抛出异常和(不安全地)放弃效果类型来模拟 error,如下所示:

module Test.Test where

import Prelude
import Effect (Effect)
import Effect.Exception (throw)
import Unsafe.Coerce (unsafeCoerce)

main :: Effect Unit
main = do
   _ <- pure $ error "Doesn't fail"
   error' "Fails"

error :: ∀ a . String -> a
error = unsafeCoerce <<< throw

error' :: ∀ a . String -> Effect a
error' = throw

但这不起作用:如果我在大型程序中嵌入对 error 的调用,我最终会得到具有 undefined 字段的运行时对象(在 JavaScript sense),而不是一个在 error 执行后突然终止的程序。函数 throw 似乎可以满足我的要求,但对于上述用例,用 Effect 类型污染我的程序似乎不合适。

我不反对 PureScript 的行为——我不能将有效的计算转换为纯计算并仍然观察效果,​​这似乎是合理的。所以我想我错过了一个技巧(或者我还没有找到的库函数)。我正在寻找的 PureScript 成语是什么?

(测试库 purescript-assert 提供 assert 功能,但它也有类型 Effect Unit。)

您需要的是 unsafePerformEffect - 它会以透明的方式执行效果,return 其结果作为纯值。

error :: forall a. String -> a
error = unsafePerformEffect <<< throw

或者,您也可以很容易地进行 FFI:

-- PureScript
foreign import error :: String -> a

// JS (foreign module)
exports.error = msg => throw new Error(msg)