F # не будет соответствовать шаблону всех элементов списка - PullRequest
0 голосов
/ 20 мая 2019

Я написал рекурсивную функцию doMoves, которая должна соответствовать каждому элементу списка и вызывать назначенную функцию.Тем не менее, я запустил список [Draw;Draw], в котором функция Draw была вызвана только один раз.Я не уверен, почему он не соответствует каждому элементу.

Я написал рекурсивную функцию, которая должна брать заголовок списка на каждом шаге и сопоставлять его с функцией

let officiate (cards:Card list) (moves:Move list) (goal:int) = 
  let mutable heldCards = []
  let mutable deck = cards

  let doNothing = 
    heldCards

  let DrawCard = 
    lazy (
    heldCards<-List.append heldCards [deck.Head]
    List.length heldCards |> printfn "Length of Drawn heldCards: %d"
    deck<-deck.Tail)

  let rec doMoves movs = 
    match movs with
    | [] -> doNothing
    | x::xs -> 
      match x with
        | Draw -> DrawCard.Force()
      doMoves xs
  doMoves moves
  true

let moves = [Draw; Draw]
let cards = [(Jack,Clubs); (Num(8),Diamonds)]
let card = (Jack,Spades)
officiate cards moves 42

Я ожидал, что на выходе появится состояние

Length of Drawn heldCards: 1
Length of Drawn heldCards: 2

, но я получаю следующее:

Length of Drawn heldCards: 1

1 Ответ

0 голосов
/ 22 мая 2019

Ошибка в том, что DrawCard - это значение, а не функция.Чтобы написать функцию без параметров в F #, вам нужно указать единицу в качестве входных данных.то есть

  let drawCard () = //your implementation

Я попытался написать то, что, я думаю, вы пытаетесь сделать более функциональным образом:

 let officiate (cards:Card list) (moves:Move list) (goal:int) =

   let drawCard (heldCards: Card list) (deck: Card list) =
     match deck with
     | [] -> Error "Empty deck"
     | head::tail -> Ok (List.append heldCards [head], tail)

   let rec doMoves heldCards deck movs =
     printfn "Hand is %d, deck is %d." (List.length heldCards) (List.length deck)
     match movs with
     | [] -> heldCards, deck
     | x::xs ->
       match x with
         | Draw ->
             drawCard heldCards deck
             |> function
             | Ok (h, d) -> doMoves h d xs
             | Error s ->
                 printfn "An error occurred: %s" s
                 heldCards, deck
         | Discard c -> failwith "todo"
   doMoves [] cards moves

 let moves = [Draw; Draw]
 let cards = [(Jack,Clubs); (Num(8),Diamonds)]
 officiate cards moves 42
...