为什么这需要一个显式类型?

时间:2013-11-05 22:59:28

标签: haskell

我在Haskell中使用类编写了一个泛型类型转换器,如下所示:

{-# LANGUAGE FlexibleInstances #-}

class Convertable a where
    convert::a

instance Convertable (Int -> String) where
    convert = show

instance Convertable (String -> Int) where
    convert = read

main = do
    let result = ((+1) . convert :: String -> Int) "1"
    print result

但是我需要显式类型String -> Int才能使它工作(哪种方式否定了使用泛型类型转换器的目的......)

为什么需要这种类型声明,只有一种可能性满足类型?

2 个答案:

答案 0 :(得分:4)

转换不是问题,默认情况下数字类型为Num a => a,所以这里的问题是+1你有。你必须给它一个具体的类型。

答案 1 :(得分:3)

您也可以指定result的类型,ghc将推断convert的类型和(+1)的Num实例的类型:

main = do
    let result :: Int
        result = ((+1) . convert) "1"
    print result