2011-09-10 19 views
8

Haskellについての素晴らしいこと。関数の型は、その実装をほぼ指示します。すなわち、このいずれかの場合ですが、私の脳はちょうどここに、ネストされた関数の事を包み込むされていません...:Haskellでこの関数を実装する方法

mkDyn :: (Typeable a) => ((a -> IO()) -> IO()) -> ((Dynamic -> IO()) -> IO()) 

唯一の問題は、必要とされるfromDynamic呼び出しでエラー処理を処理する方法です、しかし...私は一度私は残りの部分を把握してそれに対処することができます。私はどこかに次のようなものが必要だろうと推測しています。しかし、私はラッパーラムダのものが理解できないように思える。

case fromDynamic x of 
    Just x -> f x 
    Nothing -> undefined -- TODO 
+1

うわー、私はハスケルがダイナミックなタイプのサポートを持っていたことさえ知らなかった。それはそれが[ベースで利用できる]ことは言うまでもない(http://hackage.haskell.org/packages/archive/base/latest/doc/html/ Data-Dynamic.html)。毎日何か新しいことを学ぶ。 –

+0

@Joey IIRC簡単な代入演算子で命令型コードを書くライブラリさえありますが、どこを忘れてしまったのですか。私はそれがPlanet Haskellに一度言及されたと思う。 – fuz

答えて

10

私はあなたがtoDyn、ないfromDynamicをしたいと思います。それでは、ゆっくりとこれを実行してみましょう:

mkDyn :: Typeable a => 
     ((a -> IO()) -> IO()) 
     -> (Dynamic -> IO()) 
     -> IO() 
mkDyn k f = ... 

当社の戻り値の型はIO()でなければなりませんし、我々はどちらかということkまたはfを呼び出すことで取得できます。 fを呼び出すと、私たちは何とかDynamicを具体化するため、私たちを助けませんが、それはkから(賢明に)行うことはできません。だから我々はkに電話したいと思う。 kは、引数として別の関数を必要とするので、このように起動することができます:

mkDyn k f = k (\a -> ...) 

だから、関数の引数はTypeable a => a -> IO()です。このタイプの関数はありませんが、タイプはDynamic -> IO()です。そのため我々はaDynamicにをオンにし、取得するためにtoDynを使用することができますTypeable制約:

mkDyn k f = k (\a -> f (toDyn a)) 

あり単純な実装(例えば、return()またはk (\a -> return())がありますが、これは意味をなさないように見える

+0

mkDyn k f = k $ f。 toDyn – rampion

+3

@ rampion 2人でゲームをプレイできます! 'mkDyn =(。(toDyn))'。 –

+2

私は尖ったバージョンを好む傾向があります。私は物事が本当に単純なパイプラインであるならば、ポイントフリーのスタイルしか使用しません。何か(少しでも)もっと複雑で、コードを読む次回には後悔します。 – nominolo

4

私はだまさ。 。

f :: (a -> c) 
    -> ((a -> b) -> b) 
    -> ((c -> b) -> b) 
:と Djinn programを使用

私が最初に与えられた型の一般化

(a -> c)toDyn function関数を表し、cDynamicを表します。 bIO()を表します。

ジンの結果は驚くほど簡単だった:

@djinn (a -> c) -> ((a -> b) -> b) -> ((c -> b) -> b) 
f a b c = b (\ d -> c (a d)) 

は、より具体的な作成(toDyn機能を(a -> c)を交換することにより)、我々が得る:

mkDyn :: (Typeable a) => ((a -> IO()) -> IO()) -> ((Dynamic -> IO()) -> IO()) 
mkDyn b c = b (\ d -> c (toDyn d)) 

nominolo's answerと一致しています。

+1

これはnominoloがdjinnであることを証明していますか? – Landei

関連する問題