我该怎么做才能消除此 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
。我手头没有 compiler/REPL 来提供更多细节,而且这个函数有点隐藏在一些类型类黑客的背后(https://github.com/reflex-frp/reflex/blob/9575a5660334fb8a617da1cd9aa1b522e8e4ddb7/src/Reflex/PerformEvent/Class.hs),但它的要点是如果你有一个事件携带IO
,那么你可以 运行 它发生在这个事件发生的任何地方。
现在,您已经获得 Dynamic
,但您可以
- 从中提取事件
- 也许它不需要是动态的(这没有意义,因为您不想偷看
IO
值)
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
。我手头没有 compiler/REPL 来提供更多细节,而且这个函数有点隐藏在一些类型类黑客的背后(https://github.com/reflex-frp/reflex/blob/9575a5660334fb8a617da1cd9aa1b522e8e4ddb7/src/Reflex/PerformEvent/Class.hs),但它的要点是如果你有一个事件携带IO
,那么你可以 运行 它发生在这个事件发生的任何地方。
现在,您已经获得 Dynamic
,但您可以
- 从中提取事件
- 也许它不需要是动态的(这没有意义,因为您不想偷看
IO
值)