使用reflex-dom我發現自己撰寫了以下代碼:
dynShowNumbers <- holdDyn False $ catMaybes $ updated dynMaybeShowNumbers
wheredynMaybeShowNumbers :: 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-------------...
對于相同的輸入。
我覺得,我需要上面的代碼來避免動態重新渲染我的虛擬鍵盤——即使沒有任何變化。
但是上面的行是好的做法嗎?庫中是否有有效的功能(找不到)?它類似于從串列中洗掉重復項的任務。
uj5u.com熱心網友回復:
你有幾個選擇!在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://www.uj5u.com/shujuku/427248.html
