Haskell - 模糊类型变量,为什么?

时间:2013-04-17 05:18:59

标签: haskell types

为什么以下编译:

{-# 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更改为this

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类吗?如果没有,为什么模糊不清?

1 个答案:

答案 0 :(得分:11)

问题不在于isList,而在于常量42.常量'a'具有一个具体类型的Char。常数42没有具体的类型。

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

编译器需要具体类型。如果您将main更改为以下内容,它将起作用:

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