Haskell 动态父元素

Haskell 动态父元素,haskell,reflex,Haskell,Reflex,我有这段代码,它工作得非常好。它根据字段值切换文本输入字段上的某些样式 numberInput :: (MonadWidget t m) => m (Dynamic t (Maybe Double)) numberInput = divClass "form-group" $ do let errorState = "style" =: "border-color: red" validState = "style" =: "border-color: green" r

我有这段代码,它工作得非常好。它根据字段值切换文本输入字段上的某些样式

numberInput :: (MonadWidget t m) => m (Dynamic t (Maybe Double))
numberInput = divClass "form-group" $ do
  let errorState = "style" =: "border-color: red"
      validState = "style" =: "border-color: green"
  rec n <- textInput $ def & textInputConfig_inputType .~ "number"
                           & textInputConfig_initialValue .~ "0"
                           & textInputConfig_attributes .~ attrs
      let result = fmap (readMay . unpack) $ _textInput_value n
          attrs  = fmap (maybe errorState (const validState)) result
  return result
numberInput::(MonadWidget t m)=>m(动态t(可能是双精度))
numberInput=divClass“表单组”$do
让errorState=“style”=:“边框颜色:红色”
validState=“style”=:“边框颜色:绿色”
rec n m(动态t(可能是双精度))
numberInput=do
记录

dynAttrs下面是一个小程序,其中父元素的属性(右对齐或左对齐)取决于子元素的状态:

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecursiveDo #-}
import Reflex.Dom
import qualified Data.Text as T
import Safe

main :: IO ()
main = mainWidget bodyElement 

bodyElement :: MonadWidget t m => m ()
bodyElement =  el "div" $ do
    el "h2" $ text "Dynamic parent element"
    numberInput
    return ()

numberInput :: (MonadWidget t m) => m (Dynamic t (Maybe Double))
numberInput =  do
    rec
       let errorState = ("align" :: T.Text) =: "right"
           validState = "align" =: "left"
       let result = fmap (readMay . T.unpack) $ _textInput_value n 
           attrs  = fmap (maybe errorState (const validState)) result
       n <- elDynAttr "div" attrs $ do
          n1 <- textInput $ def & textInputConfig_inputType .~ "number"
                                & textInputConfig_initialValue .~ "0"

          text "Some additional control"
          return n1
    return result
{-#语言重载字符串}
{-#语言递归do}
导入反射.Dom
导入符合条件的数据。文本为T
进口安全
main::IO()
main=mainWidget bodyElement
bodyElement::MonadWidget t m=>m()
bodyElement=el“div”$do
el“h2”$text“动态父元素”
数字输入
返回()
numberInput:(MonadWidget t m)=>m(动态t(可能是双精度))
numberInput=do
记录
让errorState=(“align”::T.Text)=:“right”
validState=“align”=:“left”
让结果=fmap(readMay.T.unpack)$\u textInput\u值n
属性=fmap(可能是错误状态(常量有效状态))结果

n下面是一个小程序,其中父元素的属性(右对齐或左对齐)取决于子元素的状态:

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecursiveDo #-}
import Reflex.Dom
import qualified Data.Text as T
import Safe

main :: IO ()
main = mainWidget bodyElement 

bodyElement :: MonadWidget t m => m ()
bodyElement =  el "div" $ do
    el "h2" $ text "Dynamic parent element"
    numberInput
    return ()

numberInput :: (MonadWidget t m) => m (Dynamic t (Maybe Double))
numberInput =  do
    rec
       let errorState = ("align" :: T.Text) =: "right"
           validState = "align" =: "left"
       let result = fmap (readMay . T.unpack) $ _textInput_value n 
           attrs  = fmap (maybe errorState (const validState)) result
       n <- elDynAttr "div" attrs $ do
          n1 <- textInput $ def & textInputConfig_inputType .~ "number"
                                & textInputConfig_initialValue .~ "0"

          text "Some additional control"
          return n1
    return result
{-#语言重载字符串}
{-#语言递归do}
导入反射.Dom
导入符合条件的数据。文本为T
进口安全
main::IO()
main=mainWidget bodyElement
bodyElement::MonadWidget t m=>m()
bodyElement=el“div”$do
el“h2”$text“动态父元素”
数字输入
返回()
numberInput:(MonadWidget t m)=>m(动态t(可能是双精度))
numberInput=do
记录
让errorState=(“align”::T.Text)=:“right”
validState=“align”=:“left”
让结果=fmap(readMay.T.unpack)$\u textInput\u值n
属性=fmap(可能是错误状态(常量有效状态))结果

n“失败”是什么意思?编译器错误(逐字逐句地包括它)或运行时错误(描述它)?因此,几乎不可能有人告诉你为什么你的程序不工作。所以“失败”意味着我想重写numberInput函数的工作代码,在父DOM节点上设置动态属性,但我对如何工作只有一个非常模糊的概念。我对reflect的工作原理掌握得不够,所以我对如何继续有点迷茫,无法提供任何示例代码或错误消息。但我有一个非常具体的问题。您将如何重写我提供的非常好的代码,以在父DOM节点上设置动态属性的方式。“您将如何将此代码重写为执行X而不是Y”对于SO来说是离题的。我猜您希望在
dynAttrs
的rhs中引用
n
,但是
n
被绑定在传递给
eldynatr
的参数的内部范围内。解决方案可能是从该内部作用域返回
n
(以及您可能需要的任何其他东西),并在外部作用域中再次绑定这些变量:
是否{dynAttrs“failed”是什么意思?编译器错误(包括它的全部)或运行时错误(描述它)?因此,任何人都几乎不可能知道你的程序为什么不工作。所以“失败”意味着我想重写numberInput函数的工作代码,在父DOM节点上设置动态属性,但我对如何工作只有一个非常模糊的概念。我还没有掌握足够的reflect工作原理,所以我有点担心无法继续,无法提供任何示例代码或错误消息。但我有一个非常具体的问题。您将如何重写我提供的完美代码,以在父DOM节点上设置动态属性的方式。“您将如何重写此代码以执行X而不是Y?”这与SO无关。我猜您希望在
dynAttrs
的rhs中引用
n
,但是
n
绑定在传递给
eldynatr
的参数的内部范围内。解决方案可能是返回
n
(以及您可能需要的任何其他内容)然后在外部范围内再次绑定这些变量:
do{dynAttrs user2407038的提示已经帮助我渡过了难关。谢谢你写下解决方案。我必须绕着递归Do转一转…user2407038的提示已经帮我渡过了难关。谢谢你写下解决方案。我必须绕着递归Do转一转。。。