私が試してみました
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]
したがって、これらを組み合わせるには、型変数b
resp。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
。