我正在尝试创建一个动态小部件列表,其中小部件的数量由用户输入的数值确定。此外,每个小部件都会返回一个点击事件。这是我用来获取用户输入的内容:
settings :: MonadWidget t m => m (Dynamic t (Maybe Int))
Run Code Online (Sandbox Code Playgroud)
然后我用它来生成一个随机数生成器列表(这些是 的值的事实RandomGen并不重要。它们只是用于每个元素的内容,而不是元素的数量)。:
split' :: RandomGen g => Int -> g -> [g]
-- ...
gs <- mapDyn (maybe (split' 1 g) (flip split' g)) =<< settings
Run Code Online (Sandbox Code Playgroud)
现在我有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 …Run Code Online (Sandbox Code Playgroud) 我正在尝试在reflex FRP中编写单个SVG元素
import Reflex.Dom
import qualified Data.Map as Map
main = mainWidget $ myDiv
myDiv = el "svg" $ do
elAttr "circle" $ Map.fromList [ ("cx" , "50") , ("cy", "50"), ("r" , "40"), ("stroke" , "green"), ("fill", "yellow" )]
Run Code Online (Sandbox Code Playgroud)
这不编译.希望Data.Map是正确的.我从quickref知道类型签名是:
elAttr :: String -> Map String String -> m a -> m a
Run Code Online (Sandbox Code Playgroud)
稍微好奇monad m与之相关mainWidget但主要是开始工作.
这是使用反射带来的沙箱编译的.
我尝试安装reflex并reflex-dom使用cabal install以下错误消息:
$ cabal install reflex-dom
...
cabal: The following packages are likely to be broken by the reinstalls:
lens-4.15.1
ghcjs-0.2.0
free-4.12.4
kan-extensions-5.0.1
adjunctions-4.3
Use --force-reinstalls if you want to install anyway.
Run Code Online (Sandbox Code Playgroud)
ghcjsGitHub 上的“ master”分支上的版本为0.2.0,而名为“ dedupe”的分支上的版本为0.2.1。而且我也怕被打破lens。 有没有什么办法来安装 reflex 和 reflex-dom 在洽的方式? 也许我需要更改.cabal文件
$ cabal install reflex-dom
Resolving dependencies...
In order, the following would be installed:
bifunctors-5.3 (latest: 5.4.1) (via: reflex-dom-0.3 these-0.6.2.1 lens-4.13.2.1 free-4.12.4 semigroupoids-5.0.1 …Run Code Online (Sandbox Code Playgroud) 任何人都知道如何/可以Foo在此代码中扩展GADT :
{-# language GADTs #-}
{-# language DeriveGeneric #-}
{-# language DeriveAnyClass #-}
{-# language TemplateHaskell #-}
{-# language StandaloneDeriving #-}
import Prelude (Int, String, print, ($))
import Data.GADT.Show ()
import Data.GADT.Compare ()
import Data.Dependent.Map (DMap, fromList, (!))
import Data.Dependent.Sum ((==>))
import Data.GADT.Compare.TH (deriveGEq, deriveGCompare)
import Data.Functor.Identity (Identity)
data Foo a where
AnInt :: Foo Int
AString :: Foo String
deriveGEq ''Foo
deriveGCompare ''Foo
dmap1 :: DMap Foo Identity
dmap1 = fromList [AnInt ==> 1, …Run Code Online (Sandbox Code Playgroud) 我正在使用Reflex.Dom库,它定义了一组用于创建HTML DOM元素的函数
el 创造一个元素el' 创建并返回一个元素elAttr 创建具有给定属性的元素elAttr' 创建并返回具有给定属性的元素我正在创建自己的小部件库,我不想为每个小部件定义所有这些变体.所以我编写了一个使用相同名称的类型类,但是根据彼此的方式定义了所有函数,只留下其中一个在每个实例中定义:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
module ElMaker where
import Data.Map (Map)
import qualified Data.Map as Map
import qualified Reflex.Dom as D
-- el: type of element to create
-- input: input parameter
-- output: return value
class (D.MonadWidget t m) => ElMaker t m el input output where
el :: el -> input -> m output
el e = …Run Code Online (Sandbox Code Playgroud) 在最简单的情况下,假设我有一个Dynamic t Bool,当值为true时,我想要一个空div存在,当值为false时,我不希望有任何dom元素.
稍微更一般,如果我有一个Dynamic t (Either MyA MyB),并且我的函数知道如何渲染给定a Dynamic t MyA或a Dynamic t MyB,如何调用相应的函数来渲染?