首页 > 解决方案 > 如何渲染列表的动态(`Dynamics t [a]`)?

问题描述

我可以绘制元素Dynamic t Item但不知道如何绘制元素Dynamic t [Item]

import Reflex.Dom

data ItemType
  = Apple
  | Banana
 deriving (Eq, Show)

-- In the real-world, this function build complex DOM. Oversimplified here for MCVE
-- 
itemElDyn :: MonadWidget t m => Dynamic t ItemType -> m ()
itemElDyn = display

type Items = [ItemType]

-- listItemElDyn :: MonadWidget t m => Dynamic t Items -> m ()
-- listItemElDyn = mapM_ display . sequenceA

-- listItemElDyn lsDyn = do
--   let dynList = sequenceA lsDyn
--   mapM_ display dynList

main :: IO ()
main = mainWidget $ itemElDyn (constDyn Apple)

检查类型ghci似乎是一个有效的组合


```λ> :t mapM_ display . sequence $ constDyn [Apple,Banana]                       
mapM_ display . sequence $ constDyn [Apple,Banana]
  :: (PostBuild t m, DomBuilder t m, Traversable (Dynamic t)) => m ()
*Main
λ> :t mapM_ display . sequenceA $ constDyn [Apple,Banana]
mapM_ display . sequenceA $ constDyn [Apple,Banana]
  :: (PostBuild t m, DomBuilder t m, Traversable (Dynamic t)) => m ()

但是尝试运行时出错

λ> mapM_ display . sequence $ constDyn [Apple,Banana]

<interactive>:72:1: error:
    • No instance for (Traversable (Dynamic t0))
        arising from a use of ‘it’
    • In a stmt of an interactive GHCi command: print it

标签: haskellreflexreflex-dom

解决方案


怎么样mconcat?类似(未经测试):

main = mainWidget $ display itemsDyn
  where
    itemsDyn = mconcat $ fmap (itemElDyn . constDyn) [Apple,Banana]

(你见过https://github.com/reflex-frp/reflex/blob/develop/Quickref.md吗?)


推荐阅读