F# обращение к элементу кортежа по порядковому номеру
От: zverjuga Беларусь  
Дата: 20.09.19 12:19
Оценка:
приветствую знатоков F#

возник следующий вопрос, есть ли возможность обращаться к элементу кортежа по его порядковому номеру? сам я такой информации не нашел ни в учебнике майкрофосф, ни в книге криса смитта. но книга уже старая, ей лет 8 кажись, потому возникла мысль, может есть какой прогресс? на данный момент получается, что для работы с кортежем надо обязательно перечислить все его элементы и присвоить им имена. например

let (a, b, c, d) = (1, 2, 3, 4)


в некоторых случаях это кажется излишним и хотелось бы упрощенки, как это например сделано в swift

let tuple = (1, 2, 3, 4)
tuple.0 // обращение к первому элементу кортежа
tuple.1 // обращение ко второму элементу кортежа
tuple.2 // обращение к третьем элементу кортежа
tuple.3 // обращение к четвертому элементу кортежа


печально и странно, если подобной возможности в F# нет, хотя она так и напрашивается.
проклятый антисутенерский закон
Отредактировано 20.09.2019 12:23 zverjuga . Предыдущая версия . Еще …
Отредактировано 20.09.2019 12:23 zverjuga . Предыдущая версия .
Re: F# обращение к элементу кортежа по порядковому номеру
От: MadHuman Россия  
Дата: 20.09.19 15:10
Оценка:
Здравствуйте, zverjuga, Вы писали:

Z>приветствую знатоков F#


Z>возник следующий вопрос, есть ли возможность обращаться к элементу кортежа по его порядковому номеру? сам я такой информации не нашел ни в учебнике майкрофосф, ни в книге криса смитта. но книга уже старая, ей лет 8 кажись, потому возникла мысль, может есть какой прогресс? на данный момент получается, что для работы с кортежем надо обязательно перечислить все его элементы и присвоить им имена. например


Z>
Z>let (a, b, c, d) = (1, 2, 3, 4)
Z>


можно и без задания имен всем, так
let _, _, x, _ = (1, 2, 3, 4)


для частых случаев есть функции fst snd.
ну и тут проблема что в общем случае элементы кортежа могут быть разнотиповые.
то есть тип результата потенциальной функции берущей элемент по номеру позиции будет зависеть от значения аргумента (номера позиции), что фактически вынудит привести всё к object со всем вытекающими последствиями.
Re[2]: F# обращение к элементу кортежа по порядковому номеру
От: zverjuga Беларусь  
Дата: 20.09.19 15:43
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH>для частых случаев есть функции fst snd.

MH>ну и тут проблема что в общем случае элементы кортежа могут быть разнотиповые.
MH>то есть тип результата потенциальной функции берущей элемент по номеру позиции будет зависеть от значения аргумента (номера позиции), что фактически вынудит привести всё к object со всем вытекающими последствиями.

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

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

let tuple = somefunction // функция возвращает (1, a, " ", 3+3, etc)
...
tuple.0 // обращение к элементам кортежа
tuple.1
tuple.2


чем
let (a, b, c, _, _, _, _, _, _, _) = somefunction


еще у swift есть отличная штука, когда элементам кортежа можно присвоить имена и обращение к ним происходит по именам. тут даже порядок элемента можно не указывать

let tuple = (first: 1, second: a, third: " ", fouth: 3+3)
...
tuple.first
tuple.second


порой, при чтении F# приходит мысль, что тут он уже устаревший, если сравнивать с тем же swift/kotlin/python и было бы неплохо его подогнать под более современные реалии. интересно, F# хоть развивается по версиям? или на него разработчики уже забили?
проклятый антисутенерский закон
Отредактировано 20.09.2019 15:47 zverjuga . Предыдущая версия . Еще …
Отредактировано 20.09.2019 15:44 zverjuga . Предыдущая версия .
Отредактировано 20.09.2019 15:44 zverjuga . Предыдущая версия .
Re[3]: F# обращение к элементу кортежа по порядковому номеру
От: MadHuman Россия  
Дата: 20.09.19 16:22
Оценка: 4 (1)
Здравствуйте, zverjuga, Вы писали:

MH>>ну и тут проблема что в общем случае элементы кортежа могут быть разнотиповые.

MH>>то есть тип результата потенциальной функции берущей элемент по номеру позиции будет зависеть от значения аргумента (номера позиции), что фактически вынудит привести всё к object со всем вытекающими последствиями.

Z>ну и пусть приводило бы. я к тому, что синтактически вариант свифта более упрощен. это на самом деле бывает удобнее, чем когда программист вынужден перечислять все элементы кортежа.

Z>например, у меня есть кортеж, и мне нужны только, к примеру, его первые три элемента. я точно знаю, что у него элементов больше трех, но мне нужны только первые три. в таком случае гораздо удобнее было бы писать так
на мой взгляд это не существенная проблема. на практике я не помню даже что такое хотелось, было что-то типа чтоб второй или третий брать из тупла с размерностью выходящей за пределы имеющихся стандартных функций, ну дак такая функцайка делается за минуту.


Z>еще у swift есть отличная штука, когда элементам кортежа можно присвоить имена и обращение к ним происходит по именам. тут даже порядок элемента можно не указывать


Z>

Z>let tuple = (first: 1, second: a, third: " ", fouth: 3+3)
Z>...
Z>tuple.first
Z>tuple.second


дак по сути это уже рекорд. можно объявить нужный тип рекорда с нужными именами полей и юзать далее как в твоём примере.

type MyRecord = { first: int; second: string; .... }
let r = {first: 1, second: " "}
...
r.first
r.second



Z>порой, при чтении F# приходит мысль, что тут он уже устаревший, если сравнивать с тем же swift/kotlin/python и было бы неплохо его подогнать под более современные реалии.

у меня к примеру нет ощущения что там надо что-то подгонять. то есть нет ощущения, что надо как-то язык улучшать/расширять, для большинства задач достаточно. хотя это конечно только мой относительно не очень большой опыт, не пишу каждый день код на F#.
хотя к примеру переключаясь потом на C# уже остро ощущается нехватки фич F# (мощный паттерн матчинг, удобные рекорды и т.п.). сейчас уже в C# вроде что-то подтянули, но такого лаконичного синтаксиса как F# и кайфа не будет.


Z>интересно, F# хоть развивается по версиям? или на него разработчики уже забили?

развивается эволюционно, на гитхабе есть код F# (он опенсорсный) и трэкер, там довольно активное обсуждение фич и всего прочего.
Re: F# обращение к элементу кортежа по порядковому номеру
От: torvic Голландия  
Дата: 20.09.19 16:51
Оценка: 3 (1)
Здравствуйте, zverjuga, Вы писали:
Z>печально и странно, если подобной возможности в F# нет, хотя она так и напрашивается.
насколько я вижу они пытались ввиде синтаксиса .ItemX
https://github.com/fsharp/fslang-suggestions/issues/628
но не прокатило, поскольку в F# туплы безразмерные, а в .net лимит Tuple<T1,T2,T3,T4,T5,T6,T7,TRest>
Re: F# обращение к элементу кортежа по порядковому номеру
От: Буравчик Россия  
Дата: 20.09.19 18:25
Оценка:
Здравствуйте, zverjuga, Вы писали:

Z>приветствую знатоков F#


Z>возник следующий вопрос, есть ли возможность обращаться к элементу кортежа по его порядковому номеру? сам я такой информации не нашел ни в учебнике майкрофосф, ни в книге криса смитта. но книга уже старая, ей лет 8 кажись, потому возникла мысль, может есть какой прогресс? на данный момент получается, что для работы с кортежем надо обязательно перечислить все его элементы и присвоить им имена. например


Z>печально и странно, если подобной возможности в F# нет, хотя она так и напрашивается.


В Haskell это можно реализовать с помощью TemplateHaskell.
Может и для F# что-то есть для работы в compile time.
Best regards, Буравчик
Re: F# обращение к элементу кортежа по порядковому номеру
От: СвободуАнжелеДевис СССР  
Дата: 23.09.19 16:31
Оценка:
Z>печально и странно, если подобной возможности в F# нет, хотя она так и напрашивается.

нет в этом никакой необходимости
не нужно перекладывать свои проблемы с пониманием функциональщины, на процедурный подход.
Нет времени на раскачку!
Re[2]: F# обращение к элементу кортежа по порядковому номеру
От: zverjuga Беларусь  
Дата: 23.09.19 19:32
Оценка:
Здравствуйте, СвободуАнжелеДевис, Вы писали:

САД>нет в этом никакой необходимости


не соглашусь
такой кот
let tuple = (1, 2, 3)


и проще и приятнее, чем
let (a, b, c) = (1, 2, 3)


САД>не нужно перекладывать свои проблемы с пониманием функциональщины, на процедурный подход.


это не имеет никакого отношения ни к функциональщине, ни к процедурщине. это прежде всего — удобство.
проклятый антисутенерский закон
Re[3]: F# обращение к элементу кортежа по порядковому номеру
От: СвободуАнжелеДевис СССР  
Дата: 24.09.19 05:04
Оценка:
Z>не соглашусь
Z>такой кот
Z>
Z>let tuple = (1, 2, 3)
Z>


Так и пиши, оно так и работает.

Z>и проще и приятнее, чем

Z>
Z>let (a, b, c) = (1, 2, 3)
Z>


Это деконструктор кортежа.
Что с ним не так?
Нет времени на раскачку!
Re[4]: F# обращение к элементу кортежа по порядковому номеру
От: zverjuga Беларусь  
Дата: 24.09.19 09:45
Оценка:
Здравствуйте, СвободуАнжелеДевис, Вы писали:

САД>Так и пиши, оно так и работает.


в F# такого синтаксиса нет. как оно может работать?
проклятый антисутенерский закон
Re[5]: F# обращение к элементу кортежа по порядковому номеру
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.09.19 10:03
Оценка:
Здравствуйте, zverjuga, Вы писали:

Z>Здравствуйте, СвободуАнжелеДевис, Вы писали:


САД>>Так и пиши, оно так и работает.


Z>в F# такого синтаксиса нет. как оно может работать?


https://stackoverflow.com/questions/27908630/how-to-name-tuple-properties

var tupleList = new List<(int Index, string Name)>
{
    (1, "cow"),
    (5, "chickens"),
    (1, "airplane")
};

foreach (var tuple in tupleList)
    Console.WriteLine($"{tuple.Index} - {tuple.Name}");
и солнце б утром не вставало, когда бы не было меня
Re[6]: F# обращение к элементу кортежа по порядковому номеру
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 24.09.19 15:40
Оценка: +1
Здравствуйте, Serginio1, Вы писали:

Z>>в F# такого синтаксиса нет. как оно может работать?

S>https://stackoverflow.com/questions/27908630/how-to-name-tuple-properties
S>var tupleList = new List<(int Index, string Name)>

Это вообще не тот язык.
Re: F# обращение к элементу кортежа по порядковому номеру
От: varenikAA  
Дата: 03.10.19 05:53
Оценка:
Здравствуйте, zverjuga, Вы писали:

Z>приветствую знатоков F#


Z>возник следующий вопрос, есть ли возможность обращаться к элементу кортежа по его порядковому номеру? сам я такой информации не нашел ни в учебнике майкрофосф, ни в книге криса смитта. но книга уже старая, ей лет 8 кажись, потому возникла мысль, может есть какой прогресс? на данный момент получается, что для работы с кортежем надо обязательно перечислить все его элементы и присвоить им имена. например


Z>
Z>let (a, b, c, d) = (1, 2, 3, 4)
Z>


Z>в некоторых случаях это кажется излишним и хотелось бы упрощенки, как это например сделано в swift


Z>
Z>let tuple = (1, 2, 3, 4)
Z>tuple.0 // обращение к первому элементу кортежа
Z>tuple.1 // обращение ко второму элементу кортежа
Z>tuple.2 // обращение к третьем элементу кортежа
Z>tuple.3 // обращение к четвертому элементу кортежа
Z>


Z>печально и странно, если подобной возможности в F# нет, хотя она так и напрашивается.


Я решил этот так, может пригодится:

open System
open Microsoft.FSharp.Reflection

let write = fun a ->
    let args = if FSharpType.IsTuple(a.GetType()) then FSharpValue.GetTupleFields(a) else [|a|]
    let fmt = args |> Array.indexed |> Array.fold (fun s e -> s + (sprintf "{%d}" (fst e))) ""
    Console.Write(fmt.Trim(), args)

write ("Всё", " ", "будет", " ", "хорошо", "!")
write ("\r\n")
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: F# обращение к элементу кортежа по порядковому номеру
От: Poopy Joe Бельгия  
Дата: 06.01.20 11:04
Оценка: +1
Здравствуйте, zverjuga, Вы писали:

Z>Здравствуйте, СвободуАнжелеДевис, Вы писали:


САД>>Так и пиши, оно так и работает.


Z>в F# такого синтаксиса нет. как оно может работать?


Для именованных полей есть Records, не стоит выдумывать велосипед. Если нужен tuple больше 2х-3х элементов, то это скорее проблема дизайна, а не языка.
Re: F# обращение к элементу кортежа по порядковому номеру
От: zverjuga Беларусь  
Дата: 20.03.20 14:29
Оценка:
небеса услышали. наткнулся на "что нового в F# 4.6"
https://docs.microsoft.com/ru-RU/dotnet/fsharp/whats-new/fsharp-46

и что я вижу? а вижу я "анонимные записи". ну не совсем то, но по смыслу очень близко. именно этого так не хватало.
проклятый антисутенерский закон
Re: F# обращение к элементу кортежа по порядковому номеру
От: varenikAA  
Дата: 05.06.20 05:49
Оценка:
Здравствуйте, zverjuga, Вы писали:

Z>приветствую знатоков F#


Z>возник следующий вопрос, есть ли возможность обращаться к элементу кортежа по его порядковому номеру? сам я такой информации не нашел ни в учебнике майкрофосф, ни в книге криса смитта. но книга уже старая, ей лет 8 кажись, потому возникла мысль, может есть какой прогресс? на данный момент получается, что для работы с кортежем надо обязательно перечислить все его элементы и присвоить им имена. например


Z>
Z>let (a, b, c, d) = (1, 2, 3, 4)
Z>


Z>в некоторых случаях это кажется излишним и хотелось бы упрощенки, как это например сделано в swift


Z>
Z>let tuple = (1, 2, 3, 4)
Z>tuple.0 // обращение к первому элементу кортежа
Z>tuple.1 // обращение ко второму элементу кортежа
Z>tuple.2 // обращение к третьем элементу кортежа
Z>tuple.3 // обращение к четвертому элементу кортежа
Z>


Z>печально и странно, если подобной возможности в F# нет, хотя она так и напрашивается.


Есть, но что это за печаль? Просто F# непростой, но примитивный язык. Используется в основном для приседаний.

let tupleToList t = 
    if Microsoft.FSharp.Reflection.FSharpType.IsTuple(t.GetType()) 
        then Some (Microsoft.FSharp.Reflection.FSharpValue.GetTupleFields t |> Array.toList)
        else None

let listToTuple l =
    let l' = List.toArray l
    let types = l' |> Array.map (fun o -> o.GetType())
    let tupleType = Microsoft.FSharp.Reflection.FSharpType.MakeTupleType types
    Microsoft.FSharp.Reflection.FSharpValue.MakeTuple (l' , tupleType)
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: F# обращение к элементу кортежа по порядковому номеру
От: varenikAA  
Дата: 23.06.20 07:09
Оценка:
Здравствуйте, zverjuga, Вы писали:

Z>приветствую знатоков F#


Z>возник следующий вопрос, есть ли возможность обращаться к элементу кортежа по его порядковому номеру? сам я такой информации не нашел ни в учебнике майкрофосф, ни в книге криса смитта. но книга уже старая, ей лет 8 кажись, потому возникла мысль, может есть какой прогресс? на данный момент получается, что для работы с кортежем надо обязательно перечислить все его элементы и присвоить им имена. например


Z>
Z>let (a, b, c, d) = (1, 2, 3, 4)
Z>


Z>в некоторых случаях это кажется излишним и хотелось бы упрощенки, как это например сделано в swift


Z>
Z>let tuple = (1, 2, 3, 4)
Z>tuple.0 // обращение к первому элементу кортежа
Z>tuple.1 // обращение ко второму элементу кортежа
Z>tuple.2 // обращение к третьем элементу кортежа
Z>tuple.3 // обращение к четвертому элементу кортежа
Z>


Z>печально и странно, если подобной возможности в F# нет, хотя она так и напрашивается.


Вот, извращался над ФП языками, в F# получилось только через рефлексию(runtime)

F#

В Nemerle через макрос (compile-time)

Nemerle
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: F# обращение к элементу кортежа по порядковому номеру
От: zverjuga Беларусь  
Дата: 26.06.20 08:36
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Вот, извращался над ФП языками, в F# получилось только через рефлексию(runtime)


AA>F#


ну оно сразу было понятно, что только через рефлексию.
проклятый антисутенерский закон
Re: F# обращение к элементу кортежа по порядковому номеру
От: Воронков Василий Россия  
Дата: 25.06.21 11:04
Оценка: +1
Здравствуйте, zverjuga, Вы писали:

Z>возник следующий вопрос, есть ли возможность обращаться к элементу кортежа по его порядковому номеру? сам я такой информации не нашел ни в учебнике майкрофосф, ни в книге криса смитта. но книга уже старая, ей лет 8 кажись, потому возникла мысль, может есть какой прогресс? на данный момент получается, что для работы с кортежем надо обязательно перечислить все его элементы и присвоить им имена. например

Z>
Z>let (a, b, c, d) = (1, 2, 3, 4)
Z>

Z>в некоторых случаях это кажется излишним и хотелось бы упрощенки, как это например сделано в swift
Z>
Z>let tuple = (1, 2, 3, 4)
Z>tuple.0 // обращение к первому элементу кортежа
Z>tuple.1 // обращение ко второму элементу кортежа
Z>tuple.2 // обращение к третьем элементу кортежа
Z>tuple.3 // обращение к четвертому элементу кортежа
Z>


Если проблема больше практическая, чем теоретическая, то для небольших кортежей, скажем, в пределах 3-5 элементов, можно понаделать перегруженных экстеншинов ElementAt. А если теоретическая... то F# действительно кажется слегка устаревшим в плане банального удобства — местами даже по сравнению с C#.
Re[2]: F# обращение к элементу кортежа по порядковому номеру
От: varenikAA  
Дата: 25.07.21 15:06
Оценка:
Здравствуйте, Воронков Василий, Вы писали:


ВВ>Если проблема больше практическая, чем теоретическая, то для небольших кортежей, скажем, в пределах 3-5 элементов, можно понаделать перегруженных экстеншинов ElementAt. А если теоретическая... то F# действительно кажется слегка устаревшим в плане банального удобства — местами даже по сравнению с C#.


F# это удобный ЯП для программирования в малом.
регулярно использую его для анализа, например json-данных.
vscode + ionide + repl. сносно оформляют вывод. сам F# лаконичен и выразителен.
C# с его убогими record очень далеко до удобства F# с его DU.
проблема ТС кончено банальна — психологическое неприятие.
Но если посмотреть здраво, то ему нужны все 4 элемента и он почему-то не хочет их матчить
если же речь об одном элементе, то матч тоже рулит
let (_ , two, _, _) = //....

вместо хардкорного
x.1

, — типичный пример бритвы окама. лишняя сущность в синтаксисе.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.