我在Haskell文件中有这些函数,它们工作正常:
func1 :: Integer -> (Integer,Integer) -> [[String]] -> ([Char],[Char],[Char],[Char]) -> (Integer,Integer)
func1 distance agent mymap moves = func5 (func3 agent (func2 distance agent mymap) moves)
func2 :: Integer -> (Integer,Integer) -> [[String]] -> [(Integer,Integer)]
func3 :: (Ord a, Ord b) => (b,a) -> [(b,a)] -> ([Char],[Char],[Char],[Char]) -> [(b,a)]
func4 :: (Int,Int) -> (Int,Int) -> ([Char],[Char],[Char],a) -> ([Char],[Char],[Char],[Char]) -> [[[Char]]] -> [[[Char]]]
func5 [(a,b)] = (a,b)
但是当我写这个函数时:
func6 agent distance mymap moves moves2 = func4 agent (func1 distance agent mymap moves) moves moves2 mymap
我收到此错误:
*ERROR "play.hs":176 - Type error in application
* * * Expression : moveWithFood agent (giveNearestCorrect distance agent mymap moves) moves moves2 mymap
* * * Term : giveNearestCorrect distance agent mymap moves
* * * Type : (Integer,Integer)
* * * Does not match : (Int,Int)*
与ghci相同的错误:
play.hs:176:93:
Couldn't match expected type `Integer' against inferred type `Int'
Expected type: (Integer, Integer)
Inferred type: (Int, Int)
In the second argument of `giveNearestCorrect', namely `agent'
In the second argument of `moveWithFood', namely
`(giveNearestCorrect distance agent mymap moves)'
Failed, modules loaded: none.*
我尝试了几件事来解决它但我无法成功。你能告诉我应该怎么做吗? 感谢。
答案 0 :(得分:4)
正如pigworker指出的那样,Int
和Integer
的类型不同。如果您只有几个点需要“翻译”,fromIntegral
可能就是您的选择。
对于常见应用Int
通常足够好(并且比Integer
更快),所以我建议你尝试专门使用它。
另一种可能性是使用Num
类型类。以下是适用于Int
和Integer
的函数的示例:
func1 :: Num a => a -> (a, a) -> [[String]] -> ([Char],[Char],[Char],[Char]) -> (a, a)
您可能需要在内部使用一些fromIntegral
调用,具体取决于您的原始实现。
答案 1 :(得分:0)
您使用agent
作为func1
/ giveNearestCorrect
的第二个参数(因此根据类型签名,它必须是(Integer, Integer)
) func4
/ moveWithFood
的第一个参数(因此它必须是(Int, Int)
)。
agent
不能同时是(Integer, Integer)
和 (Int, Int)
。选择一个,坚持下去:我会按照pigworker的评论中的建议。