Можно ли запустить что-то в Eff в функции галогенового ComponentHTML?

Есть несколько привязок к moment.js, которые я хотел бы использовать для рендеринга промежутков времени в моем Halogen UI, у которых есть что-то типа

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

Если я хочу использовать эту функцию в моем пользовательском интерфейсе следующим образом:

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

Но это в Eff так что я не могу.

То, что я могу сделать, это вызвать момент с этой функцией:

ЯШ:

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

пс:

foreign import duration_ :: Number -> String

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

Мой вопрос (или несколько) тогда:

Это "обман", чтобы позвонить в JavaScript, не говоря, что это Eff, Если нет, то когда это считается нормальным, а когда нет? Я мог бы прищуриться в любом случае и увидеть эти функции как побочные эффекты или нет.

Если я не смог бы изменить способ, которым я звоню, или это плохая идея, есть ли способ сделать это в HTML?

1 ответ

Решение

Действительно, невозможно выполнить что-либо эффектное во время рендеринга в галогене, так как HTML только данные и рендер state -> HTML,

Как говорит Фил в комментарии, вам не нужно использовать Eff хотя в сигнатуре функций FFI, если вы уверены, что они не выполняют никаких эффектов. В этом случае это, вероятно, безопасно, так как это в основном арифметика по датам - но могут быть какие-то специфичные для локали вещи, происходящие? Если это так, то это только немного хитроумно, поскольку, по крайней мере, оно всегда будет давать одинаковый результат на одной и той же машине, если только часы ОС не испорчены. Я бы немного колебался, чтобы принять это как отсутствие эффекта, но если бы это было действительно проблемой, и мне нужно было это сделать, я бы по крайней мере гарантировал, что функция не экспортируется, поэтому ее нельзя использовать где-либо еще, кроме как в исключительное обстоятельство.

Вы можете просто сделать это в компоненте eval где-то и сохранить значение в состоянии компонента - myTimeStamp должно быть уже там, чтобы вы могли вычислить это значение одновременно? Таким образом, вы не пересчитываете статическое значение с каждым render тоже.

Другие вопросы по тегам