F # — получение первого элемента кортежа из функции типа опции

#f# #tuples #option

#f# #Кортежи #тип опции

Вопрос:

Я пытаюсь получить доступ к первому элементу кортежа. Обычно я использую fst (tuple), но эта ситуация немного отличается.

 let getCard (pl : player) : (card * player) option =
    let plDeck = pl 
    match plDeck with
    | c1::re -> Some (c1,(re)) 
    | [] -> None 
  

Это мой код f #. тип игрока — это список ints , а результат — кортеж с первым int из списка игроков, а список игроков минус первый int .

Это задание из моего класса информатики, поэтому требуется, чтобы я использовал тип опции.

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

 let gc = fst (getCard [1,2,3])
  

но, похоже, я не могу сделать это таким образом, поскольку я получаю предупреждение:

Ожидалось, что это выражение будет иметь тип «a * ‘b’, но здесь имеет тип ‘(card * player) option’

Как мне обойти это?

Комментарии:

1. getCard возвращает параметр, fst получает кортеж, поэтому вы не можете передать возвращаемое значение getCard в fst . Подумайте о том, чтобы make gc тоже был опцией.

Ответ №1:

Компилятор сообщает вам, что вы пытаетесь получить доступ к опции кортежа card * player, в то время как функция fst ожидает кортеж card * player .

Вы можете сопоставить шаблон с вашей функцией getCard и извлечь карту.

 let result = 
    match getCard [1..5] with
    | Some card -> fst(card)
    | None -> -1
  

Вы также можете использовать сопоставление с образцом для извлечения первой части вашего кортежа.

 let result = 
    match getCard [1..5] with
    | Some (card, _) -> card
    | None -> -1
  

Как было предложено @Guran, вы не должны возвращать магические числа

 let result = 
    match getCard [1..5] with
    | Some (card, _) -> Some card
    | None -> None
  

Комментарии:

1. Однако использование «магического значения», такого как -1, является плохим тоном. Гораздо лучше использовать параметр в качестве возвращаемого значения и здесь. т.е. Some card соответственно None

2. верно, я сделал предположение, что op просто хотел значение

3. Возможно. Но, учитывая, что это было назначение с целью введения типа опции, было бы, безусловно, уместно использовать его и для конечного результата.

4. Спасибо, это отличное решение!