case-of с Random.Generate Int - PullRequest
2 голосов
/ 21 июня 2019

Я новенький с вязом. Версия вяза - 0.19. Я пытаюсь использовать Ranndom.int для выбора типа корабля, но не знаю, как это сделать. Что мне делать с функцией numToShip? Изменить тип?

Вот мой код ...

type ShipType
    = Battleship
    | Cruiser   
    | Destroyer 
    | Submarine 

numToShip : Int -> ShipType
numToShip num =
   case num of
     0 -> Destroyer
     1 -> Battleship
     2 -> Cruiser
     _ -> Submarine

shipName : ShipType -> String
shipName shipType =
  case shipType of
    Destroyer ->
        "Destroyer"
    Battleship ->
        "Battleship"
    Cruiser ->
        "Cruiser"
    Submarine ->
        "Submarine"

randomShip : String
randomShip =
  shipName (numToShip (Random.int 0 3) )

Сообщение об ошибке:

The 1st pattern in this `case` causing a mismatch:

 146|   case num of

 147|>    0 -> Destroyer 

 148|     1 -> Battleship

 149|     2 -> Cruiser

 150|     _ -> Submarine

The first pattern is trying to match integers:
    Int

But the expression between `case` and `of` is:
    Random.Generator Int

Они никогда не могут совпадать! Проблема в шаблоне? Или это выражение?

1 Ответ

2 голосов
/ 21 июня 2019

Random.int не возвращает Int, но Generator Int.Затем вы вызовете Random.generate, чтобы превратить этот Generator в Cmd, который затем вызовет вашу функцию update с сгенерированным значением.

Одна из характеристикВяз в том, что все функции pure , что означает, что одни и те же входы всегда приводят к одинаковым выходам.Поскольку каждый раз, когда вы вызываете функцию, вы запрашиваете другое значение, вам нужно передать эту команду во время выполнения, которая может обработать нечистоту запроса (это то же самое, что происходит, когда вы хотите связаться свнешний мир через HTTP или JavaScript).См. пример Random в Руководстве по вязу для получения более подробной информации.

В качестве альтернативы, вы можете сразу получить значение из Generator, если вы готовы предоставить начальное число, используемое для вычисления случайного значения.Вы можете использовать Random.step, который принимает Generator и Seed и производит значение и следующего семени, которое вы можете подаватьвернуться в step, если вам нужно несколько значений.Вы, вероятно, захотите сделать это только в том случае, если полезно иметь возможность «воспроизвести» ваши случайные значения, так как удерживать Seed довольно сложно.В противном случае, просто используйте generate, чтобы создать Cmd.

...