#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
. Подумайте о том, чтобы makegc
тоже был опцией.
Ответ №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. Спасибо, это отличное решение!