12

以下がコンパイルされるのはなぜですか。

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverlappingInstances #-}

class IsList a where
  isList :: a -> Bool

instance IsList a where
  isList x = False

instance IsList [a] where
  isList x = True

main = print (isList 'a') >> print (isList ['a'])  

しかしmainこれに変更:

main = print (isList 42) >> print (isList [42])  

次のエラーが発生します。

Ambiguous type variable `a0' in the constraints:
  (Num a0) arising from the literal `42' at prog.hs:13:22-23
  (IsList a0) arising from a use of `isList' at prog.hs:13:15-20
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `isList', namely `42'
In the first argument of `print', namely `(isList 42)'
In the first argument of `(>>)', namely `print (isList 42)'

isListきっとNumクラスにいないよね?そうでない場合、なぜあいまいなのですか?

4

1 に答える 1

16

問題は isList ではなく、定数 42 にあります。定数 'a' の具象型は Char です。定数 42 には具体的な型がありません。

ghci> :t 42
42 :: Num a => a

コンパイラには具象型が必要です。main を次のように変更すると機能します。

main = print (isList (42 :: Int)) >> print (isList [42 :: Int])  
于 2013-04-17T05:25:35.807 に答える