PureScript 等同于 Haskell prelude 中的‘error’
PureScript equivalent to ‘error’ from Haskell prelude
我是 PureScript 的新手,正在尝试找到“断言失败”的成语。我通常在以下情况下使用它来停止执行:
- 我需要依赖的一个不变量被破坏了
- 代码的一个分支无法访问
- 我想推迟表达式的实现,但希望它在运行时“快速失败”(而不是仅仅产生
undefined
)
在 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)
我是 PureScript 的新手,正在尝试找到“断言失败”的成语。我通常在以下情况下使用它来停止执行:
- 我需要依赖的一个不变量被破坏了
- 代码的一个分支无法访问
- 我想推迟表达式的实现,但希望它在运行时“快速失败”(而不是仅仅产生
undefined
)
在 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)