2017-05-26 8 views
2
main = mainWidget $ 
    el "div" $ do 
    let fileInputConfig = FileInputConfig (constDyn Map.empty) 
    fi <- fileInput fileInputConfig 

    let uploads :: Dynamic t [File]   = value fi 
    upload  :: Dynamic t (Maybe File)  <- (return . fmap headMay) uploads 
    getNameAction :: Dynamic t (Maybe (IO Text)) <- (return . fmap (getNameText <$>)) upload 
    filename  :: Dynamic t (Maybe Text)  <- (return . fmap (unsafePerformIO <$>)) getNameAction 

    el "div" $ dynText (show <$> filename) 
    return() 
    where getNameText :: MonadIO m => File -> m Text 
     getNameText = getName 

タイプとの接続ドットを再生するために最善を尽くしましたが、unsafePerformIOを使用せずにパスを見つけることができませんでした。私はこのケースでは安全だと思うが、明らかにあなたがしたいかもしれない他の同様のものが安全ではないだろう。このReflex.DomコードのunsafePerformIOを削除するにはどうすればよいですか?

+1

「動的t(多分IOテキスト)」の外側のレイヤーに 'IO'を入れてバインドする必要があります。 'sequenceA'は、アプリケーションの外部への通勤の一般的な方法です。すなわち、 'sequenceA ::(IO a) - > IO(Maybe a)'のような、 'sequenceA ::(Traversable t、Applicative f)=> t(f a) - > f(t a)'である。しかし、それは '動的なt'が移動可能であることを必要とし、私はそれがあるかどうかわかりません。 – luqui

+0

sequenceAはIOを外部に持っています(つまり私は 'Dynamic t(IO(Maybe Text))'で終わります)。しかし、 'unsafePerformIO 'を使わずに' Dynamic t(Maybe Text) '。 – John

+0

ええ、ダイナミックなものは何ですか、あなたはどのライブラリを使っていますか? – luqui

答えて

4

このような場合は、通常performEventが必要です。私はコンパイラ/ REPLを持っていないので、より詳細な情報を提供することはできません。その機能はいくつかのタイプクラッカー(https://github.com/reflex-frp/reflex/blob/9575a5660334fb8a617da1cd9aa1b522e8e4ddb7/src/Reflex/PerformEvent/Class.hs)の裏に隠されていますが、その要点はIOのイベントがあれば実行できますこのイベントが発生した場合はどこでも。

さて、あなたはDynamic持っているが、あなたは

  • はあなたのドンとして、多分それは、それは意味がありません(ダイナミックである必要はありません、それ
  • からイベントを抽出することができますIOの値を参照してください)
+0

ありがとう、私は 'performEvent'を探しています。 – John

関連する問題