2016-07-18 5 views
-4

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

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. Я не могу понять, как его реализовать.

ответ

5

Я рекомендую вам переделку 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, который никогда не вернет Nothing?

+1

Похоже, вы используете [UI monad] (http://hackage.haskell.org/package/threepenny-gui-0.6.0.6/docs/Graphics-UI-Threepenny-Core.html#g:3) из пакета [три пенни] (http://hackage.haskell.org/package/threepenny-gui-0.6.0.6) - правильно? – ErikR

+0

Я понятия не имею, что использует OP - вы, вероятно, правы. – chi

+0

UI монада не из трехпенсового пакета! Монада написана мной 'data UI a = UI a'. И экземпляр Functor, Applicativ, Monad для пользовательского интерфейса. – QSpider

Смежные вопросы