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
。我认为在这种情况下它是安全的,但显然还有其他类似的事情,你可能想做的事情是不安全的。我能做些什么来消除这个Reflex.Dom代码中的unsafePerformIO?
您必须将'IO'移动到'Dynamic t(Maybe(IO Text))'的外层,以便将其绑定。 'sequenceA'是向外通过应用程序的一般方式,例如, (序列A ::可能(IO a)→IO(可能a))。序列A ::(可逆性t,应用性f)=> t(f a)→f(t a)但是这需要'Dynamic t'是可以穿越的,我不知道它是否是。 – luqui
sequenceA确实将IO传递到外部(即,我最终得到了一个'Dynamic t(IO(Maybe Text))'),但是我仍然不确定如何将它转换为没有unsafePerformIO的'Dynamic t(Maybe Text)' '。 – John
是的,什么是'Dynamic t',你在用什么库? – luqui