Haskell 在Lambda函数中没有show的实例?

Haskell 在Lambda函数中没有show的实例?,haskell,lambda,Haskell,Lambda,这在ghci中非常有效: printRobot (fight killerRobot gentleGiant) 但这给我带来了一个“无需展示”的错误,我似乎不明白为什么。 threeRoundFight a b = (\a b -> printRobot (fight a b)) 这就是错误: • No instance for (Show ((((t40, t50, t50) -> t50) -> t60)

这在ghci中非常有效:

printRobot (fight killerRobot gentleGiant)
但这给我带来了一个“无需展示”的错误,我似乎不明白为什么。

threeRoundFight a b = 
(\a b -> printRobot (fight a b))
这就是错误:

• No instance for (Show
                     ((((t40, t50, t50) -> t50) -> t60)
                      -> (((t20, t10, t60) -> ((t20, t10, t60) -> t0) -> t0)
                          -> (([Char], a10, a0) -> [Char]) -> t30)
                      -> t30))
    arising from a use of ‘print’
    (maybe you haven't applied a function to enough arguments?)
• In the first argument of ‘print’, namely ‘it’
  In a stmt of an interactive GHCi command: print it
以下是需要考虑的必要功能:

fight aRobot defender = damage defender attack
where attack = if getHP aRobot > 10
            then getAttack aRobot
            else 0

printRobot aRobot = aRobot(\(n,a,h)->n ++ " attack:" ++ (show a) ++ " hp: " ++ (show h))

robot (name,attack,hp) = \message -> message (name,attack,hp)
以下是机器人(我输入的参数,即killerRobot和gentleGiant):

正如你所看到的,我正试图通过用嵌套的lambda覆盖机器人的帮助,使这成为一场三回合的战斗。但我似乎不明白,如果第一场比赛成功了,我该如何继续进行下去。

threeRoundFight a b = (\a b -> printRobot (fight a b))
相当于

threeRoundFight x y = (\a b -> printRobot (fight a b))
             -- ^^^ unused variables
(如果启用警告,GHC将帮助您检测此错误)

这不是你想要的。你可能想要

threeRoundFight = (\a b -> printRobot (fight a b))
-- or
threeRoundFight a b = printRobot (fight a b)

为什么在这里使用
aRboto(…)
?在“打印机器人”中?这样我就可以选择要打印的机器人了?aRobot只是一个变量?如果不使用
数据
类型,而是将一个fobot本质上表示为一个函数,将一个三元组映射到某个对象,映射到某个对象,那么就很难理解了。虽然这基本上就是在lambda演算中“存储”数据的方式,但它使事情变得更加复杂。啊,是的,我能理解。。这是我第二次尝试学习和理解haskell,而这本书还没有涉及到数据类型,所以我就不去读它,直到它说不出来。这是哪本书?哦,这完全有道理,但你给我的第一行我已经试过了。它不起作用。当我这样做时,我得到了这个“由于使用“printRobot”而产生的不明确类型变量'a0'。第二行我做不到,因为我正在使用lambdas,并试图通过使用嵌套lambdas:/覆盖变量来理解这本书的意思。无论哪种方式,您的解释都帮助我更好地理解了。@当您的代码没有明确指定要使用的类型时,就会出现鲁贝尔不明确的类型变量。我建议对源代码进行注释,为所有顶级函数(或至少足够多的函数)添加显式类型签名。通常,这会解决很多问题。是的,我完全同意。我觉得这本书还没有涵盖这一点很奇怪。它只是告诉我在没有它们的情况下做这些练习。谢谢你的帮助。
threeRoundFight = (\a b -> printRobot (fight a b))
-- or
threeRoundFight a b = printRobot (fight a b)