Clojure,Haskell的Either Monad,以及可能失败的计算序列

时间:2016-10-28 03:07:04

标签: clojure

摘要问题:

我有一系列的计算。任何步骤都可能失败。如果步骤失败,则应使用消息中止整个过程。

Haskell解决方案:

+ IO Monads。

(已知)Clojure解决方案:

  1. 抛出异常。
  2. 使用clojure / algo.monads
  3. 问题:

    我应该注意其他解决方案吗?这个问题的标准'Clojure方式'是什么?

    我遇到的具体例子:

    我正在使用https://github.com/kovasb/gamma通过ClojureScript在WebGL中设置GLSL着色器。典型的程序包括:

    1. 分配VertexShader对象
    2. 编译VertexShader。
    3. 分配FragmentShader对象。
    4. 编译FragmentShader
    5. 分配程序对象。
    6. 链接程序
    7. 使用程序

    8. 分配VertexBufferObjects

    9. 上传VertexBufferObject数据
    10. 分配TextureObject
    11. 上传纹理
    12. 设置制服。
    13. 进行实际通话。

      任何这些步骤都可能失败(着色器无法编译,不再有BufferObjects,格式错误等等)

      在失败时,我希望其他所有内容都终止,以获取错误并修复它。处理这个问题的典型“Clojure方式”是什么? (在Haskell中,它是EitherT IO Monad)

2 个答案:

答案 0 :(得分:1)

虽然我不确定它是否适用于您的具体情况,但{C} {C}中的some->宏通常用于可能失败的计算序列(其中“fail”=“return nil”)。

答案 1 :(得分:0)

最简单的方法是使用Java异常。然而,抓住错误并处理。

一个小的改进是使用with-exception-default from the Tupelo library.示例用法是这样的:

(with-exception-default 666
  (Long/parseLong "123"))
;=> 123

(with-exception-default 666
  (Long/parseLong "12xy3"))
;=> 666