在Haskell中缓存函数的结果

QSp*_*der -4 haskell

我使用以下函数生成GUID:

import Data.UUID as UV
import Data.UUID.V1 as UV1

generateUUID :: String
generateUUID = UV.toString $ fromJust $ unsafePerformIO UV1.nextUUID
Run Code Online (Sandbox Code Playgroud)

我用它generateUUID来创建元素

createWidgetUI element uuid =
    WidgetUI { wui_title    = ""
             , wui_id       = uuid
             , wui_attr_style = ""
             , wui_attr_class = ""
             , wui_styles   = []
             , wui_scripts  = []
             , wui_contents = []
             , wui_children = []
             , wui_element  = element
             }

wuiPanel :: UI WidgetUI
wuiPanel = do
    return $ createWidgetUI elem uuid
    where
        uuid = generateUUID
        elem = ContainerUI $ H.div
Run Code Online (Sandbox Code Playgroud)

当我wuiPanel多次调用该方法时,我得到相同的UUID值!但我需要每次调用方法wuiPanel来获取具有不同UUID值的元素.我无法理解如何实现它.

chi*_*chi 5

我建议你重新修改UUID代,以便它适合UI你正在使用的monad.unsafe一般情况下最好避免使用 - 特别是在像你这样的情况下,你使用它们来欺骗编译器:类似String承诺value是一个固定的常量字符串值,允许编译器优化假设.这将使代码非常非常脆弱,因为它可能起作用或不起作用,具体取决于优化.

在下面的代码中,我猜几种类型,因此这与您的库完全不匹配.

generateUUID :: IO String
generateUUID = UV.toString . fromJust <$> UV1.nextUUID

wuiPanel :: UI WidgetUI
wuiPanel = do
    uuid <- liftIO generateUUID
    let elem = ContainerUI $ H.div
    return $ createWidgetUI elem uuid
Run Code Online (Sandbox Code Playgroud)

要做的事情:更好地处理nextUUID,Nothing如果你太快请求UUID ,可能会返回"(文档中可怕的引用).你确定你不能使用V4.nextRandom永远不会返回Nothing的吗?