Здравствуйте, 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[6]: F# обращение к элементу кортежа по порядковому номеру
Здравствуйте, zverjuga, Вы писали:
Z>Здравствуйте, СвободуАнжелеДевис, Вы писали:
САД>>Так и пиши, оно так и работает.
Z>в F# такого синтаксиса нет. как оно может работать?
Для именованных полей есть Records, не стоит выдумывать велосипед. Если нужен tuple больше 2х-3х элементов, то это скорее проблема дизайна, а не языка.
Re: F# обращение к элементу кортежа по порядковому номеру
Здравствуйте, 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[3]: F# обращение к элементу кортежа по порядковому номеру
AA>, — типичный пример бритвы окама. лишняя сущность в синтаксисе.
Этот синтаксис — x.[1] — все равно есть в языке, и то, что он здесь не работает — нелогично и странно. А вообще я не понимаю, откуда у некоторых товарищей такое яростное желание защищать *отсутствие* фишек, которые абсолютно нейтральны, ничему не мешают и строятся на имеющемся синтаксисе.
А по поводу "уродливости" C#... Метки для элементов кортежей, которые живут только в компайл-тайме и разруливаются компилятором, — очень даже простое и изящное решение обсуждаемой здесь проблемы. F# стоило бы присмотреться.
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# нет, хотя она так и напрашивается.
Здравствуйте, 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, Вы писали:
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: 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)
ВВ>Если проблема больше практическая, чем теоретическая, то для небольших кортежей, скажем, в пределах 3-5 элементов, можно понаделать перегруженных экстеншинов ElementAt. А если теоретическая... то F# действительно кажется слегка устаревшим в плане банального удобства — местами даже по сравнению с C#.
F# это удобный ЯП для программирования в малом.
регулярно использую его для анализа, например json-данных.
vscode + ionide + repl. сносно оформляют вывод. сам F# лаконичен и выразителен.
C# с его убогими record очень далеко до удобства F# с его DU.
проблема ТС кончено банальна — психологическое неприятие.
Но если посмотреть здраво, то ему нужны все 4 элемента и он почему-то не хочет их матчить
если же речь об одном элементе, то матч тоже рулит
let (_ , two, _, _) = //....
вместо хардкорного
x.1
, — типичный пример бритвы окама. лишняя сущность в синтаксисе.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: F# обращение к элементу кортежа по порядковому номеру
Здравствуйте, varenikAA, Вы писали:
AA>, — типичный пример бритвы окама. лишняя сущность в синтаксисе.
Неправильно ты, дядя Федор, про синтаксис думаешь.
Язык это не система аксиом, его упрощать и обеднять до минимума не очень полезно, и даже вредно. Сахар, добавляющий удобства, это чаще хорошо и правильно. Иначе возникает проблема известная как Turing tarpit.
"Beware of the Turing tar-pit in which everything is possible but nothing of interest is easy." https://en.wikipedia.org/wiki/Turing_tarpit
Re[4]: F# обращение к элементу кортежа по порядковому номеру
Здравствуйте, D. Mon, Вы писали:
DM>Здравствуйте, varenikAA, Вы писали:
AA>>, — типичный пример бритвы окама. лишняя сущность в синтаксисе.
DM>Неправильно ты, дядя Федор, про синтаксис думаешь.
Ну хорошо, в данном случае какие преимущества у предложенного способа перед матчем?
Может тогда и для массивов ввести вместо arr[0] arr.0 ?
Вот почему-то в лиспе понятие кортеж вообще не используется. Список.
цитата с мсдн
Как правило, лучше использовать сопоставление шаблонов для доступа к отдельным элементам кортежа.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: F# обращение к элементу кортежа по порядковому номеру
Здравствуйте, varenikAA, Вы писали:
AA>Ну хорошо, в данном случае какие преимущества у предложенного способа перед матчем?
Банально меньше буковок, и не придется менять, если тупл при рефакторинге станет длиннее или короче.
AA>Может тогда и для массивов ввести вместо arr[0] arr.0 ?
Это уже экстремизм.
AA>Вот почему-то в лиспе понятие кортеж вообще не используется. Список.
Там обычно есть гетерогенный вектор, который работает как тупл и дает элементы по индексу.
Clojure:
> (let [a ["zero" 1 'two]] (a 2))
two
Racket:
> (let ((v #("zero" 1 two))) (vector-ref v 2))
'two
Есть и еще более прямой вариант кортежей — возврат нескольких значений.
(define (foo x)
(values "hi" x (* x x)))
(let-values ([(a b c) (foo 5)])
(format "~a, ~a and ~a" a b c))