是否可以在卤素组件 HTML 函数中 运行 产生某些效果?

Is it possible to run something in Eff in a halogen ComponentHTML funcion?

有几个绑定到 moment.js 我想在我的 Halogen UI 中用于渲染时间跨度,它们的类型类似于

diffMins :: forall eff. Moment -> Moment -> Eff (now :: NOW | eff) Number

如果我想在 UI 中像这样使用此功能:

H.span_ [H.text $ diffMins (fromEpoch_ 0) (fromEpoch_ myTimeStamp)]

但这是在 Eff 所以我不能。

我能做的就是用这个函数调用 moment:

js:

exports.duration_ = function (millis) {
    return moment.duration(millis).humanize();
};

ps:

foreign import duration_ :: Number -> String

humanizeMilliseconds :: Milliseconds -> String
humanizeMilliseconds (Milliseconds n) = duration_ n

那么我的问题(或几个):

是否"cheating"调用javascript而不说它是Eff。如果不是,什么时候可以,什么时候不能?无论哪种方式,我都可以吐出来,看看这些功能是否有副作用。

如果我不能改变调用 moment 的方式,或者这确实是个坏主意,在 HTML 中有没有办法做到这一点?

在 Halogen 渲染期间确实不可能执行任何有效的操作,因为 HTML 只是数据而渲染是 state -> HTML

正如 Phil 在评论中所说,如果您确定 FFI 函数没有任何作用,则不必在 FFI 函数的签名中使用 Eff。在这种情况下,它可能是安全的,因为它基本上是日期的算术 - 但可能会发生一些特定于语言环境的事情?如果是这样,它只是有点狡猾,因为至少它总是会在同一台机器上给出相同的结果,除非 OS 时钟被弄乱了。我会有点犹豫是否接受它是免费的,但如果它真的是一个问题并且我需要这样做我至少会确保该功能不会被导出所以它不能在其他任何地方使用除了特殊情况。

不过,您可以在组件 eval 的某处执行此操作,并将值存储在组件状态中 - myTimeStamp 必须已经存在,因此您可以同时计算该值?这样你就不会重新计算每个 render 的静态值。