簡體   English   中英

如何消除此Reflex.Dom代碼中的unsafePerformIO?

[英]What can I do to eliminate the unsafePerformIO in this Reflex.Dom code?

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找不到路徑。 我認為在這種情況下它是安全的,但顯然還有其他類似的事情,你可能想要這樣做是不安全的。

對於這樣的事情,你通常需要performEvent 我手邊沒有編譯器/ REPL來提供更多細節,而且這個函數隱藏在一些類型類hackery背后( https://github.com/reflex-frp/reflex/blob/9575a5660334fb8a617da1cd9aa1b522e8e4ddb7/src/Reflex/ PerformEvent / Class.hs ),但它的要點是,如果你有一個承載IO的事件,那么你可以在發生此事件的任何地方運行它。

現在,你已經擁有了Dynamic ,但你可以

  • 從中提取事件
  • 也許它不需要是動態的(它沒有意義,因為你不想偷看IO值)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM