使用reflex-dom,我发现自己编写了以下代码:
dynShowNumbers <- holdDyn False $ catMaybes $ updated dynMaybeShowNumbers当按下或释放一个键时,dynMaybeShowNumbers :: Dynamic t (Maybe Bool)就会触发,但只有当两个特定键中的一个更改状态(即按下或不按下)时,它的值才等于Nothing。当两个键中的一个被释放时,它会触发Just False。
原因是我展示了一个虚拟键盘,它通常依赖于按键被按下或释放的任何事件。对于dynMaybeShowNumbers,我只需过滤出两个需要按住的相关键,以显示虚拟数字垫。
在dynShowNumbers :: Dynamic t Bool不依赖于上面的Dynamic t (Maybe Bool)的情况下,我可以轻松地编写更简单的代码。
然而:
在这种情况下,只要按下任何键,我就会触发dynShowNumbers:
False---False---False------False--True---True----False----False----...而上述代码将导致
False-----------------------------True-----------False-------------...同样的输入。
我觉得,我需要上面的行来避免我的虚拟键盘的动态重呈现--即使没有什么变化。
但以上这条线是否良好的做法呢?在库中有有效的函数(找不到)吗?它类似于从列表中删除重复项的任务。
发布于 2022-02-16 02:51:04
你有几个选择!在Reflex.Dynamic中,您可以使用以下hold变体:
-- | Create a new 'Dynamic' that only signals changes if the values actually
-- changed.
holdUniqDyn :: (Reflex t, MonadHold t m, MonadFix m, Eq a) => Dynamic t a -> m (Dynamic t a)
-- | Create a new 'Dynamic' that changes only when the underlying 'Dynamic'
-- changes and the given function returns 'False' when given both the old and
-- the new values.
holdUniqDynBy :: (Reflex t, MonadHold t m, MonadFix m) => (a -> a -> Bool) -> Dynamic t a -> m (Dynamic t a)在Reflex.Dynamic.Uniq中似乎有一种更有原则、基于类型的方法。整个单元都集中在这种情况下。
https://stackoverflow.com/questions/71135414
复制相似问题