我有一个默认具有此类型的函数:
func :: Integer -> (Integer,Integer) -> [[String]] -> ([Char],[Char],[Char],[Char]) -> (Integer,Integer)
但我希望它返回(Int,Int) 当我写这篇文章时:
func:: Integer -> (Integer,Integer) -> [[String]] -> ([Char],[Char],[Char],[Char]) -> (Int,Int)
我收到此错误: 主> :我玩
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 :(得分: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
。
这里的问题是Int
和Integer
是不同的类型,并且编译器不会隐式地在它们之间进行转换 - 你必须明确地这样做,因此调用{{1} }。 fromInteger
从fromInteger
转换为任何数字类型。