5

私が試してみました

map show . mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn ()]

しかし、それは戻った

["()"]
4

2 に答える 2

7

問題はfromDynamic、単相型にならなければならないということです。ピッキング()ですが、型アノテーションを使用すると、他のタイプを選択させることができます。

それを表示するには、可能なすべてのタイプを順番に試す関数が必要になります。おそらく、このようなデータを保存したくないが、いくつかの操作(showなど)と一緒にデータを保存したい場合があります。

バンドルする方法は2つあります。私のお気に入りは、すべての関数を値に事前に適用することです(したがって、showの場合は、タイプのサンクのリストを取得するだけですString)。

もう1つの方法は、関数をDynamic(正しい単相型であることを確認してください!)に入れてから、を使用することdynApplyです。

于 2013-02-04T21:35:13.367 に答える
5

あなたのコードはあなたが期待することをしません。キックインの動的な振る舞いのずっと前に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

于 2013-02-04T21:36:28.090 に答える