2013-03-30 30 views
1

更改功能类型我有一个具有这种类型的默认功能:在Haskell

func :: Integer -> (Integer,Integer) -> [[String]] -> ([Char],[Char],[Char],[Char]) -> (Integer,Integer) 

但我想它返回(INT,INT) 当我写这篇:

func:: Integer -> (Integer,Integer) -> [[String]] -> ([Char],[Char],[Char],[Char]) -> (Int,Int) 

我得到这个错误: 主>:l播放

ERROR "play.hs":64 - Type error in explicitly typed binding 
*** Term   : func 
*** Type   : Integer -> (Integer,Integer) -> [[String]] -> ([Char],[Char],[Char],[Char]) -> (Integer,Integer) 
*** Does not match : Integer -> (Integer,Integer) -> [[String]] -> ([Char],[Char],[Char],[Char]) -> (Int,Int) 

我怎样才能解决这个问题?谢谢。

+0

“Int”不是“整数”。 Haskell在数字类型之间没有隐式转换。 – nymk

+0

@nymk你有任何建议来解决它吗?谢谢。 – jason

回答

3

编写一个新的包装函数来包装func,然后使用包装函数。

func' :: Integer -> 
     (Integer,Integer) -> 
     [[String]] -> 
     ([Char],[Char],[Char],[Char]) -> 
     (Int,Int) 
func' a b c d = (fromInteger x, fromInteger y) where 
    (x, y) = func a b c d 

或者,你可以插入到fromInteger来电直接进入func

这里的问题是,IntInteger是不同的类型,编译器不会隐式地在它们之间进行转换 - 您必须明确地进行转换,因此需要调用fromIntegerfromIntegerInteger转换为任何数字类型。