gpt4 book ai didi

haskell - 基于threepenny-gui中列表框选择的其他元素的变化

转载 作者:行者123 更新时间:2023-12-05 00:21:54 28 4
gpt4 key购买 nike

所以我有一个简单的示例布局,其中包含一个列表框、一个按钮和一个 textarea,单击按钮会更改 textarea 中的文本:

import Control.Applicative
import Control.Monad
import Data.Maybe

import qualified Graphics.UI.Threepenny as UI
import Graphics.UI.Threepenny.Core

main :: IO ()
main = startGUI defaultConfig setup

setup :: Window -> UI ()
setup w = do
return w # set UI.title "Simple example"

listBox <- UI.listBox (pure ["First", "Second"]) (pure Nothing) ((UI.string .) <$> (pure id))
button <- UI.button # set UI.text "Button"
display <- UI.textarea # set UI.text "Initial value"

element listBox # set (attr "size") "10"

getBody w #+ [element listBox, element button, element display]

on UI.click button $ const $ do
element display # set UI.text "new text"

我想要做的是让更改取决于列表框选择(例如,根据选择将 "new text" 设为 "First""Second")。

通过组合 userSelection,我可以很容易地获得选择。和 facts作为
facts . userSelection :: ListBox a -> Behavior (Maybe a)

但是因为设置 textarea 的值是用
set text :: String -> UI Element -> UI Element

我不知道如何解决选择是 Behavior 的事实。 .

所有这些对我来说似乎有点单调,我想知道这样做的正确方法是什么。也许我应该在列表框选择完成或更改时做一些事情,而不仅仅是在按下按钮时。

最佳答案

首先,有a regression这影响了这里的代码。这个问题现在解决了。 Threepenny 0.6.0.3 有一个临时修复程序,最终的修复程序将包含在此后的版本中。

pastebin you provided中的代码几乎是正确的。唯一需要更改的是您不需要使用 sink在按钮单击回调中 - 在您的情况下,sink应该在行为和文本区域的内容之间建立永久连接,行为值会随着按钮点击事件而变化。

为了完整起见,这是一个完整的解决方案:

{-# LANGUAGE RecursiveDo #-}
module Main where

import Control.Applicative
import Control.Monad
import Data.Maybe

import qualified Graphics.UI.Threepenny as UI
import Graphics.UI.Threepenny.Core

main :: IO ()
main = startGUI defaultConfig setup

setup :: Window -> UI ()
setup w = void $ mdo
return w # set UI.title "Simple example"

listBox <- UI.listBox
(pure ["First", "Second"]) bSelected (pure $ UI.string)
button <- UI.button # set UI.text "Button"
display <- UI.textarea

element listBox # set (attr "size") "10"

getBody w #+ [element listBox, element button, element display]

bSelected <- stepper Nothing $ rumors (UI.userSelection listBox)
let eClick = UI.click button
eValue = fromMaybe "No selection" <$> bSelected <@ eClick
bValue <- stepper "Initial value" eValue

element display # sink UI.text bValue

要带走的两个关键事项是:
  • Behavior (Maybe a)论据 listBox不只是设置初始选定值,而是决定了在应用程序的整个生命周期中值的演变。在本例中,facts $ UI.userSelection listBox只是 bSelected , 可以通过 the source code of the Widgets module 验证.
  • 在事件发生时对行为进行采样的典型方法是通过 (<@) (或 <@> 如果事件携带您希望使用的数据)。
  • 关于haskell - 基于threepenny-gui中列表框选择的其他元素的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30735436/

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