2017-05-26 56 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