Нет экземпляра для шоу, в лямбда-функции? - PullRequest
0 голосов
/ 06 сентября 2018

Это прекрасно работает в 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):

killerRobot = robot ("killer",25,200)
gentleGiant = robot ("Mr.Friendly", 10, 300)

Также, как вы можете видеть, я пытаюсь сделать этот бой threeRound с помощью перезаписи роботов с помощью вложенных лямбд.Но я не могу понять, как продолжить игру после первого боя, если у меня все получится.

1 Ответ

0 голосов
/ 06 сентября 2018

Линия

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...