У меня обычно есть момент "о да", пишущий F #, когда я понимаю, что мне нужно где-то дополнительное значение.Как правило, это легко сделать, добавив еще одно значение к передаваемому кортежу.Однако это означает, что различные карты / сортирует / собирает / и т.д.требуется обновление, и, в частности, функции fst / snd работают только с кортежами длины 2.
Это не очень большая проблема, но она достаточно раздражает во время исследовательской разработки, что я бы написал помощника, чтобы облегчитьраздражение:
let inline get2 (t:^a) = (^a : (member get_Item2 : unit -> string) (t, ()))
let inline get2a (t:^a) = (^a : (member Item2 : string) t)
Однако обе версии не работают.Первый, get2
, не скомпилируется, с "Ожидается 1 выражение, получено 2".Второй, get2a
, будет скомпилирован, но впоследствии не может использоваться для кортежей: «Тип '(int * string)' не поддерживает никаких операторов с именем 'get_Item2'".
Есть ли какие-либоспособ сделать это, что не связано с большим количеством перегрузок? с шумными OverloadID
аннотациями (аннотации не требуются в F # 2.0)