質問する
144 次
1 に答える
5
reifyConstraint がこの問題を解決することは正しいです。この関数が行うことは、制約をデータ型、つまりデータ型に変換 (または「具体化」) することDict
です。例えば
>:t reifyConstraint (Proxy :: Proxy Show) mytuple
(reifyConstraint (Proxy :: Proxy Show) mytuple)
:: Rec (Dict Show :. Identity) '[Integer, Bool]
このレコードの各要素は form になりDict (Identity _)
ます。Dict
と定義されている
data Dict c x where Dict :: c x => x -> Dict c x
(Dict Show :. Identity) a
ここで必要なのは、 aを入力として処理できるトラバーサル関数だけです。
printi :: Compose (Dict Show) Identity a -> IO (Compose (Dict Show) Identity a)
printi x@(Compose (Dict a)) = print a >> return x
Show
制約は必要ないことに注意してくださいa
。Show
クラス辞書はDict
データ型に格納されます。この関数で rtraverse できます。
main = rtraverse printi (reifyConstraint (Proxy :: Proxy Show) mytuple)
于 2015-04-05T14:40:12.263 に答える