私が試してみました
map show . mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn ()]
しかし、それは戻った
["()"]
私が試してみました
map show . mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn ()]
しかし、それは戻った
["()"]
問題はfromDynamic、単相型にならなければならないということです。ピッキング()ですが、型アノテーションを使用すると、他のタイプを選択させることができます。
それを表示するには、可能なすべてのタイプを順番に試す関数が必要になります。おそらく、このようなデータを保存したくないが、いくつかの操作(showなど)と一緒にデータを保存したい場合があります。
バンドルする方法は2つあります。私のお気に入りは、すべての関数を値に事前に適用することです(したがって、showの場合は、タイプのサンクのリストを取得するだけですString)。
もう1つの方法は、関数をDynamic(正しい単相型であることを確認してください!)に入れてから、を使用することdynApplyです。
あなたのコードはあなたが期待することをしません。キックインの動的な振る舞いのずっと前にData.Dynamic、Haskellタイプチェッカーはタイプを解決します。式の右部分のタイプは次のとおりです。
mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn ()] :: Typeable b => [b]
左の部分のタイプは
map show :: Show a => [a] -> [String]
したがって、これらを組み合わせるには、型変数bresp。a統一されます。これを通常のHaskellファイルからコンパイルする場合、コンパイラーは警告(The type variable `a' is ambigous)を出します。しかし、GHCiでは、インタプリタはデフォルトで。になり()ます。
fromDynamicただし、これにより、式のタイプがに固定され、タイプのDynamic -> Maybe ()すべての要素が効果的に選択されます()。
fromDynamic型署名を指定するなどして、コンパイラに別の型を使用させると、別の型が選択されることがわかります。
Prelude Data.Dynamic Data.Maybe> map (show :: Integer -> String) . mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn ()]
["3"]
残念ながら、目的を達成する方法はありません。その情報はに利用できないため、タイプがshowインスタンスをサポートするすべての要素を選択してくださいfromDynamic。