main = mainWidget $
el "div" $ do
let fileInputConfig = FileInputConfig (constDyn Map.empty)
fi <- fileInput fileInputConfig
let uploads :: Dynamic t [File] = value fi
upload :: Dynamic t (Maybe File) <- (return . fmap headMay) uploads
getNameAction :: Dynamic t (Maybe (IO Text)) <- (return . fmap (getNameText <$>)) upload
filename :: Dynamic t (Maybe Text) <- (return . fmap (unsafePerformIO <$>)) getNameAction
el "div" $ dynText (show <$> filename)
return ()
where getNameText :: MonadIO m => File -> m Text
getNameText = getName我尽我最大的努力与类型进行连接,但如果不使用unsafePerformIO,我就找不到出路。我认为在这种情况下它是安全的,但显然还有其他类似的事情你可能想做,这是不安全的。
发布于 2017-05-26 08:37:18
对于这种情况,您通常需要performEvent。我手头没有编译器/REPL来提供更多细节,而且函数是隐藏在某些类型类黑客(https://github.com/reflex-frp/reflex/blob/9575a5660334fb8a617da1cd9aa1b522e8e4ddb7/src/Reflex/PerformEvent/Class.hs)后面的,但是它的要点是,如果您有一个带有IO的事件,那么您可以在该事件发生的任何地方运行它。
现在,你有了Dynamic,但你可以
IO值)https://stackoverflow.com/questions/44196562
复制相似问题