我试图找出如何使用Haskell threepenny-gui及其reactive功能来编写一个程序,让
我似乎需要使用Handler
,newEvent
和register
来完成上述操作。如果有人能够指出一些现有的代码可以做出类似上面的事情那么好。
我发现的最近的是{penner-gui GameThing.hs
目录中的samples
(但它不会使用register
)。
更新:
我在问我是否应该使用Handler
,newEvent
和register
---如果是的话,还要对这些功能做一些澄清或示例。
另外,要清楚,大局是:
browser --> threepenny-gui (on localhost) --> backend server (anywhere on network)
<-- <--
换句话说,我需要做一些IO(根据用户选择)然后显示该IO的结果。
更新:这是我的解决方案(基于@ Taldykin的回应):https://github.com/haroldcarr/rdf-triple-browser/tree/master/haskell/src
答案 0 :(得分:3)
这是一段代码。我稍后会添加说明。
{-# LANGUAGE LambdaCase #-}
import Graphics.UI.Threepenny as UI
main :: IO ()
main = do
(evFillList, doFillList) <- newEvent
initialList <- valuesSupply ""
behFillList <- stepper initialList evFillList
startGUI defaultConfig $ \win -> do
list <- ul
sel <- listBox
behFillList
(pure Nothing)
(pure $ \it -> UI.span # set text it)
getBody win #+ [grid [[element list, element sel]]]
setFocus $ getElement sel
on selectionChange (getElement sel) $ \case
Nothing -> return ()
Just ix -> do
items <- currentValue behFillList
let it = items !! ix
liftIO $ valuesSupply it >>= doFillList
element list #+ [li # set html it]
setFocus $ getElement sel
valuesSupply :: String -> IO [String]
valuesSupply x = return [x ++ show i | i <- [0..9]]