2011-10-30 8 views
6

PolyTypeableは、多型に類似しています。しかし、それは予測不可能ではなく動作します。polyTypeOfは神秘的です

ghci> :t show 
show :: Show a => a -> String 
ghci> polyTypeOf show 
a1 -> [Char] 
ghci> :t fromEnum 
fromEnum :: Enum a => a -> Int 
ghci> polyTypeOf fromEnum 

<interactive>:1:12: 
    Ambiguous type variable `a0' in the constraint: 
     (Enum a0) arising from a use of `fromEnum' 
    Probable fix: add a type signature that fixes these type variable(s) 
    In the first argument of `polyTypeOf', namely `fromEnum' 
    In the expression: polyTypeOf fromEnum 
    In an equation for `it': it = polyTypeOf fromEnum 

ライブラリのソースコードを理解するのは非常に難しいです、あなたが説明できる理由polyTypeOfは、引数の特定のセットを受け入れ、他の受け入れに失敗し、でも非常によく似ていますか?

答えて

7

理由は

Prelude> show undefined 
"*** Exception: Prelude.undefined 
Prelude> fromEnum undefined 

<interactive>:0:1: 
    Ambiguous type variable `a0' in the constraint: 
     (Enum a0) arising from a use of `fromEnum' 
    Probable fix: add a type signature that fixes these type variable(s) 
    In the expression: fromEnum undefined 
    In an equation for `it': it = fromEnum undefined 

の場合と同じである、すなわち、GHCiの年代は、不履行のルールは、それがShow制約のためではなく、Enum制約のあいまいさを解決できるように拡張しました。 foo = polyTypeOf showでソースファイルをコンパイルしようとすると、あいまいな型の変数エラーが発生します({-# LANGUAGE ExtendedDefaultRules #-}を使用しない限り)。

+0

いい例。 。 – luqui

+0

'polyTypeOf show'は'() - > String'のようなデフォルトではないので、感謝しませんでした。 – modular

+0

そして 'polyTypeOf fromEnum'と同様の作業をする方法はありますか?おそらくいくつかの 'default(...)'を設定していますか? – Wizek

関連する問題