3

I can draw element for Dynamic t Item but don't know how to draw element of 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)

Checking the type in ghci seem like a valid combination


```λ> :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 ()

but got error when try to run

λ> 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
wizzup
  • 2,361
  • 20
  • 34
  • How about just `display (constDyn [Apple,Banana])` ? – luqui Sep 08 '19 at 08:59
  • @luqui Sorry, that not what exactly what I want, maybe my code is too minimal. The real problem is I already have complex version of display single item and I want to repeatedly apply them for each of element in the list. – wizzup Sep 08 '19 at 09:26
  • In that case I would go look at how `display` is implemented for inspiration. – luqui Sep 08 '19 at 11:08

1 Answers1

0

What about mconcat? Something like (untested):

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

(Have you seen https://github.com/reflex-frp/reflex/blob/develop/Quickref.md?)

mb21
  • 34,845
  • 8
  • 116
  • 142