0

我在 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.*

我尝试了几件事来解决它,但我无法成功。你能告诉我我应该怎么做吗?谢谢。

4

2 回答 2

4

正如pigworker所指出的,Int并且Integer不是同一类型。如果您只有几点需要“翻译”,fromIntegral可能是要走的路。

对于常见的应用程序Int通常足够好(并且比 更快Integer),所以我建议您尝试专门使用它。

另一种可能性是使用Num类型类。以下是适用于Int和的函数的示例Integer

func1 :: Num a => a -> (a, a) -> [[String]] -> ([Char],[Char],[Char],[Char]) -> (a, a)

您可能需要在fromIntegral内部使用一些调用,具体取决于您的原始实现。

于 2013-03-31T14:24:01.230 回答
0

您正在用作/agent的第二个参数(因此它必须是一个,根据类型签名),并且还用作/的第一个参数(所以它必须是一个)。func1giveNearestCorrect(Integer, Integer)func4moveWithFood(Int, Int)

agent不能同时是 an(Integer, Integer) an (Int, Int)。选择一个并坚持下去:我会遵循 pigworker 评论中的建议。

于 2013-03-31T14:28:48.147 回答