2017-03-03 7 views
1

は下記考えてみましょう:明示的にクラスメソッドの戻り値の型を指定していますか?

class Test m a where 
    t :: Int -> m a 

instance Test [] Int where 
    t i = [i] 

instance Test Maybe Int where 
    t i | i == 0 = Nothing 
     | otherwise = Just i 

main = do 
    print $ t (22 :: Int) --Error! 

これは、次のエラーでスローされます。

Ambiguous type variables ‘m0’, ‘a0’ arising from a use of ‘print’ 
    prevents the constraint ‘(Show (m0 a0))’ from being solved. 

これは、コンパイラがm aのどのインスタンスに使用する特定の方法がないためです。どのように私はこれを明示することができますか?

答えて

8

tへの完全なコール注釈:上の適切な拡張子を持つ、1が明示的に

タイプレベルの引数を渡すことができ、

print (t 22 :: Maybe Int) 

またはより高度な代替案としてt自体

print $ (t :: Int -> Maybe Int) 22 

に注釈を付けるに

print $ t @Maybe @Int 22 

これにより、非常に長いアノテーションを入力する必要がなくなります。

関連する問題