Кэширование результатов функции в Haskell

haskell

133 просмотра

1 ответ

198 Репутация автора

Я использую следующую функцию для генерации GUID:

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

generateUUID :: String
generateUUID = UV.toString $ fromJust $ unsafePerformIO UV1.nextUUID

И я использую 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

Когда я вызываю метод wuiPanelнесколько раз, я получаю одно и то же значение UUID! Но мне нужно каждый вызов метода, wuiPanelчтобы получить элементы с различным значением UUID. Я не могу понять, как это реализовать.

Автор: QSpider Источник Размещён: 18.07.2016 08:03

Ответы (1)


5 плюса

84594 Репутация автора

Решение

Я бы порекомендовал вам переработать генерацию UUID так, чтобы она соответствовала UIмонаде, в которой вы работаете. В unsafeобщем, лучше избегать вещей, особенно в тех случаях, как у вас, когда вы используете их, чтобы лгать компилятору: такой тип Stringобещает Значение - это фиксированное, постоянное строковое значение, позволяющее компилятору оптимизировать это. Это сделает код очень и очень хрупким, поскольку он может работать или не работать в зависимости от оптимизации.

В приведенном ниже коде я предполагаю несколько типов, поэтому они не могут точно соответствовать вашей библиотеке.

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

Для этого: лучшая обработка nextUUID, которая может возвращать Nothing«если вы слишком быстро запрашиваете UUID» (страшная цитата из документации). Вы уверены, что не можете использовать тот, V4.nextRandomкоторый никогда не вернет Nothings?

Автор: chi Размещён: 18.07.2016 09:56
Вопросы из категории :
32x32