3
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. 我认为在这种情况下它是安全的,但显然你可能想做的其他类似的事情并不安全。

4

1 回答 1

4

对于这样的事情,您通常需要performEvent. 我手头没有编译器/REPL 来提供更多细节,并且该功能有点隐藏在一些类型类黑客背后(https://github.com/reflex-frp/reflex/blob/9575a5660334fb8a617da1cd9aa1b522e8e4ddb7/src/Reflex/ PerformEvent/Class.hs),但它的要点是,如果你有一个事件携带IO,那么你可以在这个事件发生的任何地方运行它。

现在,你得到了Dynamic,但你可以

  • 从中提取事件
  • 也许它不需要是动态的(这没有意义,因为你不想偷看IO价值)
于 2017-05-26T08:37:18.290 回答