2016-07-18 5 views
-4
I는 GUID 생성하기 위해 다음 함수를 사용

의 함수의 결과를 Сaching :하스켈

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

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

하고 난 메소드를 호출 요소

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 

의 창작 generateUUID를 사용 wuiPanel 여러 번, 나는 같은 UUID 값을 얻는다! 하지만 다른 UUID 값을 가진 요소를 얻으려면 모든 메소드 wuiPanel을 호출해야합니다. 나는 그것을 구현하는 방법을 이해할 수 없다.

답변

5

나는 당신이 작업하고있는 UI 모나드에 맞도록 당신이 UUID 세대를 재 추천 할 것 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 

을 수행합니다 (워드 프로세서에서 무서운 인용) "당신은 너무 빨리 UUID를 요청하는 경우" Nothing을 반환 할 수 있습니다 nextUUID의 더 나은 처리. Nothing을 회신하지 않는 V4.nextRandom을 사용할 수 없습니까?

+1

[UI 모나드] (http://hackage.haskell.org/package/threepenny-gui-0.6.0.6/docs/Graphics-UI-Threepenny-Core.html#g:3)를 사용하고있는 것으로 보입니다. [threepenny 패키지] (http://hackage.haskell.org/package/threepenny-gui-0.6.0.6) - 맞습니까? – ErikR

+0

OP가 무엇을 사용하고 있는지 잘 모르겠습니다. 아마도 맞을 것입니다. – chi

+0

UI 모나드가 threepenny 패키지가 아닙니다! Monad는'data UI a = UI a '라고 쓰여졌습니다. 그리고 Inst Functor, Applicativ, Monad for UI. – QSpider