возник следующий вопрос, есть ли возможность обращаться к элементу кортежа по его порядковому номеру? сам я такой информации не нашел ни в учебнике майкрофосф, ни в книге криса смитта. но книга уже старая, ей лет 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# нет, хотя она так и напрашивается.
Здравствуйте, 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# обращение к элементу кортежа по порядковому номеру
Здравствуйте, 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# хоть развивается по версиям? или на него разработчики уже забили?
Здравствуйте, zverjuga, Вы писали:
MH>>ну и тут проблема что в общем случае элементы кортежа могут быть разнотиповые. MH>>то есть тип результата потенциальной функции берущей элемент по номеру позиции будет зависеть от значения аргумента (номера позиции), что фактически вынудит привести всё к object со всем вытекающими последствиями.
Z>ну и пусть приводило бы. я к тому, что синтактически вариант свифта более упрощен. это на самом деле бывает удобнее, чем когда программист вынужден перечислять все элементы кортежа. Z>например, у меня есть кортеж, и мне нужны только, к примеру, его первые три элемента. я точно знаю, что у него элементов больше трех, но мне нужны только первые три. в таком случае гораздо удобнее было бы писать так
на мой взгляд это не существенная проблема. на практике я не помню даже что такое хотелось, было что-то типа чтоб второй или третий брать из тупла с размерностью выходящей за пределы имеющихся стандартных функций, ну дак такая функцайка делается за минуту.
Z>еще у swift есть отличная штука, когда элементам кортежа можно присвоить имена и обращение к ним происходит по именам. тут даже порядок элемента можно не указывать
Z>
дак по сути это уже рекорд. можно объявить нужный тип рекорда с нужными именами полей и юзать далее как в твоём примере.
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# обращение к элементу кортежа по порядковому номеру
Здравствуйте, 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# обращение к элементу кортежа по порядковому номеру
Здравствуйте, zverjuga, Вы писали:
Z>приветствую знатоков F#
Z>возник следующий вопрос, есть ли возможность обращаться к элементу кортежа по его порядковому номеру? сам я такой информации не нашел ни в учебнике майкрофосф, ни в книге криса смитта. но книга уже старая, ей лет 8 кажись, потому возникла мысль, может есть какой прогресс? на данный момент получается, что для работы с кортежем надо обязательно перечислить все его элементы и присвоить им имена. например
Z>печально и странно, если подобной возможности в F# нет, хотя она так и напрашивается.
В Haskell это можно реализовать с помощью TemplateHaskell.
Может и для F# что-то есть для работы в compile time.
Best regards, Буравчик
Re: F# обращение к элементу кортежа по порядковому номеру
Здравствуйте, zverjuga, Вы писали:
Z>Здравствуйте, СвободуАнжелеДевис, Вы писали:
САД>>Так и пиши, оно так и работает.
Z>в F# такого синтаксиса нет. как оно может работать?
Здравствуйте, 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# обращение к элементу кортежа по порядковому номеру
Здравствуйте, zverjuga, Вы писали:
Z>Здравствуйте, СвободуАнжелеДевис, Вы писали:
САД>>Так и пиши, оно так и работает.
Z>в F# такого синтаксиса нет. как оно может работать?
Для именованных полей есть Records, не стоит выдумывать велосипед. Если нужен tuple больше 2х-3х элементов, то это скорее проблема дизайна, а не языка.
Re: F# обращение к элементу кортежа по порядковому номеру
Здравствуйте, 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# обращение к элементу кортежа по порядковому номеру
Здравствуйте, 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)
Здравствуйте, 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# обращение к элементу кортежа по порядковому номеру
ВВ>Если проблема больше практическая, чем теоретическая, то для небольших кортежей, скажем, в пределах 3-5 элементов, можно понаделать перегруженных экстеншинов ElementAt. А если теоретическая... то F# действительно кажется слегка устаревшим в плане банального удобства — местами даже по сравнению с C#.
F# это удобный ЯП для программирования в малом.
регулярно использую его для анализа, например json-данных.
vscode + ionide + repl. сносно оформляют вывод. сам F# лаконичен и выразителен.
C# с его убогими record очень далеко до удобства F# с его DU.
проблема ТС кончено банальна — психологическое неприятие.
Но если посмотреть здраво, то ему нужны все 4 элемента и он почему-то не хочет их матчить
если же речь об одном элементе, то матч тоже рулит
let (_ , two, _, _) = //....
вместо хардкорного
x.1
, — типичный пример бритвы окама. лишняя сущность в синтаксисе.