2016-07-18 8 views
-4

ich die folgende Funktion verwenden GUID zu generieren:Сaching die Ergebnisse der Funktion in Haskell

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

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

Und ich die generateUUID Elemente für die Schaffung von

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 

Wenn ich die Methode aufrufen, verwenden wuiPanel mehrmals bekomme ich denselben UUID-Wert! Aber ich muss bei jedem Aufruf der Methode wuiPanel Elemente mit unterschiedlichem UUID Wert bekommen. Ich kann nicht verstehen, wie man es umsetzt.

Antwort

5

Ich würde empfehlen, die UUID Generation überarbeiten, damit es die UI Monade passt in dem Sie arbeiten unsafe Dinge sind am besten in der Regel vermieden werden. - insbesondere in Fällen wie dem Ihren, wo man diejenigen liegen verwenden zu der Compiler: Ein Typ wie String verspricht, dass der Wert ein fester, konstanter Stringwert ist, der es dem Compiler ermöglicht, dies zu optimieren. Dies macht den Code sehr, sehr fragil, da er abhängig von den Optimierungen funktionieren kann oder nicht.

In dem Code unten, ich rate ein paar Typen, so konnte dies nicht genau mit Ihrer Bibliothek übereinstimmen.

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 

zu tun: eine bessere Handhabung von nextUUID, die Nothing zurückkehren könnte (beängstigend Zitat aus der Dokumentation) „wenn Sie UUIDs zu schnell anfordern“. Sind Sie sicher, dass Sie nicht die V4.nextRandom verwenden können, die niemals Nothing s zurückgibt?

+1

Es scheint, dass Sie die [UI Monade] verwenden (http://hackage.haskell.org/package/threepenny-gui-0.6.0.6/docs/Graphics-UI-Threepenny-Core.html#g:3) aus dem [Dreipenny-Paket] (http://hackage.haskell.org/package/threepenny-gui-0.6.0.6) - richtig? – ErikR

+0

Ich habe keine Ahnung, was das OP verwendet - Sie haben wahrscheinlich recht. – chi

+0

UI Monad nicht von Threepenny-Paket! Monad wird von mir 'data UI a = UI a' geschrieben. Und Instanz Functor, Applicativ, Monad für UI. – QSpider