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
. Я думаю, что в данном случае это безопасно, но, очевидно, есть и другие подобные вещи, которые вы, возможно, захотите сделать, но которые не были бы безопасными.
IO
во внешний слойDynamic t (Maybe (IO Text))
, чтобы вы могли его связать.sequenceA
- это общий способ замены аппликативного падежа наружу, например.sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)
, то естьsequenceA :: Maybe (IO a) -> IO (Maybe a)
. Но для этого потребуется, чтобыDynamic t
можно было пройти, и я не знаю, так ли это. - person luqui   schedule 26.05.2017Dynamic t (IO (Maybe Text))
), но я все еще не уверен, как превратить это вDynamic t (Maybe Text)
безunsafePerformIO
. - person John   schedule 27.05.2017Dynamic t
, с какой библиотекой ты работаешь? - person luqui   schedule 27.05.2017