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