我在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
才能使它工作(哪种方式否定了使用泛型类型转换器的目的......)
为什么需要这种类型声明,只有一种可能性满足类型?
答案 0 :(得分:4)
转换不是问题,默认情况下数字类型为Num a => a,所以这里的问题是+1你有。你必须给它一个具体的类型。
答案 1 :(得分:3)
您也可以指定result
的类型,ghc将推断convert
的类型和(+1)
的Num实例的类型:
main = do
let result :: Int
result = ((+1) . convert) "1"
print result