2

Laemmel と SPJ による2003 年のScrap Your Boilerplate ペーパーの 3 ページにコード スニペットがあります。

mkT :: (Typeable a, Typeable b) => (b -> b) -> a -> a
mkT f = case cast f of
   Just g -> g
   Nothing -> id

そして紙は説明します

つまり、mkT fx は、x の型が f の引数の型と同じ場合、f を x に適用します。

cast fこの論文の前の例のパターンに従って、の型を上記の型と比較してMaybe (b -> b)に評価する必要があると思いますJust gが、これは正しくないようです。

の署名でここで何が起こっているのcast fですか?

4

1 に答える 1

4

のタイプcast

cast :: (Typeable x, Typeable y) => x -> Maybe y

とが異なるタイプで、同じであるNothing場合に生成されます。を使用する場合は、呼び出し元のコンテキストから結果の型を決定する必要があることに注意してください。そうでない場合、未解決のオーバーロード/あいまいな型変数エラーでコンパイルが失敗します。xyJust argumentycast

この特定の例では、型は(b -> b)引数と(a -> a)結果の関数型です。そう

cast f :: Maybe (a -> a)

mkT書くこともできますmkT = fromMaybe id . cast

于 2012-07-07T13:27:01.013 に答える