Как сравнить кортежи списка со значением? - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь сравнить цветовой кортеж всех элементов в списке. Если они имеют одинаковый цвет, верните true. Если нет, верните false. Когда я запускаю код, компилятор выдает ошибку.

Я использовал сопоставление с образцом плюс вложенный оператор if, чтобы проверить, совпадает ли цвет заголовка списка со всеми другими элементами.

type Suit = Clubs | Diamonds | Hearts | Spades
type Rank = Jack | Queen | King | Ace | Num of int
type Card = Rank * Suit
type Color = Red | Black
type Move = Discard of Card | Draw


let cards = [(Jack,Clubs); (Num(8),Spades)]

let card_color (c:Card) = 
  match c with
    | _, Clubs -> Black
    | _, Spades -> Black
    | _, Diamonds -> Red
    | _, Hearts -> Red

let all_same_color cs = 
  match cs with
    | [] -> true
    | x::xs -> 
      if not card_color cs.Head = card_color x then false else true
all_same_color cards

Я ожидаю, что он вернет true, если head соответствует цветам с другими элементами или false в противном случае. F # выдает ошибку: это значение не является функцией и не может быть применено.

1 Ответ

1 голос
/ 20 мая 2019

Вы можете написать последнее правило как | x::xs -> card_color cs.Head = card_color x

Но я бы предложил написать функцию all_same_color как

let all_same_color cs =
  cs |> List.forall (fun x -> card_color x = card_color cs.Head)
...