gpt4 book ai didi

haskell - 根据数字用户输入构建反射域小部件/事件的动态列表

转载 作者:行者123 更新时间:2023-12-01 03:34:31 24 4
gpt4 key购买 nike

我正在尝试创建一个动态小部件列表,其中小部件的数量由用户输入的数值确定。此外,每个小部件都会返回一个点击事件。这是我用来获取用户输入的内容:

settings :: MonadWidget t m => m (Dynamic t (Maybe Int))

然后我用它来生成一个随机数生成器列表(这些是 RandomGen 的值的事实并不重要。它们只是用于每个元素的内容, 不是 元素的数量):

split' :: RandomGen g => Int -> g -> [g]
-- ...

gs <- mapDyn (maybe (split' 1 g) (flip split' g)) =<< settings

现在我有 gs :: (MonadWidget t m, RandomGen g) => Dynamic t [g] .一 g对于每个小部件。这些小部件返回 Event值,所以我需要将它们组合起来(即 leftmost )然后将该值与 foldDyn 一起使用某处。

go :: (MonadWidget t m, Random g) => g -> m (Event t MyType)
-- ...

clicked <- el "div" $ do
-- omg
xs <- simpleList gs go

-- would like to eventually do this
dynEvent <- mapDyn leftmost xs
return $ switch (current dynEvent)

但到目前为止,我最终得到了 xs :: Dynamic t [Dynamic t (m (Event t MyType))] .

我认为我真正需要的是以某种方式制作 xs :: MonadWidget t m => Dynamic t [Event t MyType]相反,即使使用除 simpleList 之外的其他功能,也很难到达那里.

最佳答案

你的问题是 simpleList 需要一个 Dynamic t [g](Dynamic t g -> m a) .但是,您的目标是 g -> m(事件 t MyType)。所以你需要创造一个更好的去:

go2 :: (MonadWidget t m, RandomGen g) => Dynamic t g -> m (Event t MyType)
go2 gDyn = do
mapped <- mapDyn go gDyn
dyned <- dyn mapped
held <- hold never dyned
return (switch held)

一旦你有了这个,它应该更容易为 simpleList gs go2将返回 m (Dynamic t [Event t MyType])你应该可以 mapDyn leftmost超过它。

这不是最优雅的解决方案,但这是我在尝试类似的东西时能找到的最好的解决方案。我确信它可以被提取到一些辅助函数中。

请注意,我没有随身携带编译器,并且在我的脑海中进行类型检查非常困难,因此如果它不起作用,请写下评论。当我带着编译器回家时,我会看看。

关于haskell - 根据数字用户输入构建反射域小部件/事件的动态列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35923886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com