2016-07-18 15 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 

をそして私は、私はメソッドを呼び出す要素

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 

行うには:nextUUIDのより良いハンドリングを、Nothing「あなたもすぐにUUIDを要求した場合」(ドキュメントから怖いの引用を)返す可能性があります。 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パッケージからではありません!モナドは私によって 'データUI a = UI a'と書かれています。そしてインスタンスのFunctor、Applicativ、Monad for UI。 – QSpider