2017-05-26 60 views
2
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?

+1

您必须将'IO'移动到'Dynamic t(Maybe(IO Text))'的外层,以便将其绑定。 'sequenceA'是向外通过应用程序的一般方式,例如, (序列A ::可能(IO a)→IO(可能a))。序列A ::(可逆性t,应用性f)=> t(f a)→f(t a)但是这需要'Dynamic t'是可以穿越的,我不知道它是否是。 – luqui

+0

sequenceA确实将IO传递到外部(即,我最终得到了一个'Dynamic t(IO(Maybe Text))'),但是我仍然不确定如何将它转换为没有unsafePerformIO的'Dynamic t(Maybe Text)' '。 – John

+0

是的,什么是'Dynamic t',你在用什么库? – luqui

回答

4

对于这样的事情,您通常需要performEvent。我手头没有编译器/ REPL来提供更多细节,并且该函数被隐藏在一些类型类hackery(https://github.com/reflex-frp/reflex/blob/9575a5660334fb8a617da1cd9aa1b522e8e4ddb7/src/Reflex/PerformEvent/Class.hs)之后,但其要点是,如果您有事件携带IO,那么您可以运行无论这个事件发生在哪里。现在

,你有Dynamic,但你可以

  • 从中
  • 提取事件也许它并不需要是动态的(它没有任何意义,因为你不我们不想偷看IO的值)
+0

谢谢,我现在正在研究'performEvent'。 – John