我是Haskell和reflex-dom的新手,但我非常喜欢这门语言。我一直在使用https://github.com/hansroland/reflex-dom-inbits/blob/master/tutorial.md进行学习,它非常有帮助。
我目前正在尝试创建一个函数,该函数接受一个动态参数,并创建一个元素,每当动态参数的值发生变化时调用一个FFI函数。这是我尝试做的简化版本。
这会导致编译时错误:
我目前正在尝试创建一个函数,该函数接受一个动态参数,并创建一个元素,每当动态参数的值发生变化时调用一个FFI函数。这是我尝试做的简化版本。
{-# LANGUAGE OverloadedStrings #-}
import Data.Text as T
import qualified GHCJS.DOM.Types as GDT
import GHCJS.Types
import Reflex.Dom
foreign import javascript safe
"$1.value = $2"
testSet :: JSVal -> JSVal -> IO()
testTB :: DomBuilder t m => Dynamic t T.Text -> m ()
testTB dt = do
(e, _) <- elAttr' "input" ("type" =: "text") blank
bob <- (testSet (GDT.pToJSVal e) . GDT.pToJSVal) <$> dt
return ()
main = mainWidget $ testTB $ constDyn "Hello World!"
这会导致编译时错误:
reflex-canvas.hs:14:10: error:
• Couldn't match type ‘m’ with ‘Dynamic t’
‘m’ is a rigid type variable bound by
the type signature for:
testTB :: forall t (m :: * -> *).
DomBuilder t m =>
Dynamic t Text -> m ()
at reflex-canvas.hs:11:11
Expected type: m (IO ())
Actual type: Dynamic t (IO ())
• In a stmt of a 'do' block:
bob <- (testSet (GDT.pToJSVal e) . GDT.pToJSVal) <$> dt
In the expression:
do { (e, _) <- elAttr' "input" ("type" =: "text") blank;
bob <- (testSet (GDT.pToJSVal e) . GDT.pToJSVal) <$> dt;
return () }
In an equation for ‘testTB’:
testTB dt
= do { (e, _) <- elAttr' "input" ("type" =: "text") blank;
bob <- (testSet (GDT.pToJSVal e) . GDT.pToJSVal) <$> dt;
return () }
• Relevant bindings include
e :: Element EventResult (DomBuilderSpace m) t
(bound at reflex-canvas.hs:13:4)
dt :: Dynamic t Text (bound at reflex-canvas.hs:12:8)
testTB :: Dynamic t Text -> m () (bound at reflex-canvas.hs:12:1)
我尝试了各种方法将动态内容转换为m(),但无法弄清楚。如何最好地实现这一点?
liftIO
吗?我的意思是liftIO (testSet (GDTpToJSVal e) . GDT.pToJSVal) =<< (sample $ current dt)
?我不是 Reflex 的专家,但这应该可以通过类型检查,虽然我必须说我没有验证过。 - epsilonhalbetestSet <$> ptrToHTMLControl <*> ptrToText
这样的东西。 - Jogger