F# hello wordl: почему два оператора вместо одного?
От: Mr.Delphist  
Дата: 21.05.18 16:50
Оценка:
let Привет |>

Начал на досуге глядеть в F# туториалы, и само собой полезли нубские вопросы. Скажем, работа с коллекциями:

// ------ Lists ------
let twoToFive = [2; 3; 4; 5]        // Square brackets create a list with
                                 // semicolon delimiters.
let oneToFive = 1 :: twoToFive   // :: creates list with new 1st element
// The result is [1; 2; 3; 4; 5]
let zeroToFive = [0; 1] @ twoToFive   // @ concats two lists


Внутренний перфекционист спрашивает: а зачем два оператора, :: и @, если можно было бы оставить и один из них?

  1. @-оператор требует всегда превращать одиночный элемент в коллекцию из одного элемента, наподобие [1] @ twoToFive
  2. cons-оператор (два двоеточия) ещё и запрещает переставлять аргументы местами (слева всегда должен быть одиночный элемент, а справа — коллекция).

Собственно, вопрос: в каких ситуациях может возникнуть та самая двусмысленность, из-за которой и пришлось ввести два разных оператора? Или это просто "исторически сложилось"?
Re: F# hello wordl: почему два оператора вместо одного?
От: IT Россия linq2db.com
Дата: 21.05.18 16:57
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Собственно, вопрос: в каких ситуациях может возникнуть та самая двусмысленность, из-за которой и пришлось ввести два разных оператора? Или это просто "исторически сложилось"?


Перегрузка методов F# вроде бы невозможна из-за системы типов. Скорее всего это относится и к операторам.
Если нам не помогут, то мы тоже никого не пощадим.
Re: F# hello wordl: почему два оператора вместо одного?
От: takTak  
Дата: 21.05.18 17:25
Оценка:
просто интересно: какое у f# предназначение? для чего его используют, где не подходит c#?
Re: F# hello wordl: почему два оператора вместо одного?
От: MadHuman Россия  
Дата: 21.05.18 17:31
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Внутренний перфекционист спрашивает: а зачем два оператора, :: и @, если можно было бы оставить и один из них?


это просто разные по смыслу операторы. каждый удобен в своём случае.
:: — добавляет в голову списка один элемент. это мнгновенная операция.
1 :: [2;3;4] -> [1;2;3;4]

@ — конкатенация двух списков.
list1 @ list2
операция может быть долгая, так как поэлементно с конца list1 добавляет элементы к list2.

в принципе можно выразить один через другой, но для удобства лучше 2 отдельных.
Re: F# hello wordl: почему два оператора вместо одного?
От: Sinclair Россия https://github.com/evilguest/
Дата: 22.05.18 03:48
Оценка: 6 (1) +1
Здравствуйте, Mr.Delphist, Вы писали:
MD>
MD>// ------ Lists ------
MD>let twoToFive = [2; 3; 4; 5]        // Square brackets create a list with
MD>                                 // semicolon delimiters.
MD>let oneToFive = 1 :: twoToFive   // :: creates list with new 1st element
MD>// The result is [1; 2; 3; 4; 5]
MD>let zeroToFive = [0; 1] @ twoToFive   // @ concats two lists
MD>


MD>Внутренний перфекционист спрашивает: а зачем два оператора, :: и @, если можно было бы оставить и один из них?

Я совсем не спец в F#, но, имхо, есть значительная разница между списком списков и списком элементов.
Т.е. [0;1];[2;3;4]] — совсем-совсем не то же самое, что и [0;1;2;3;4], и не то же самое, что [0;1];2;3;4].
Соответствнно, имеем разные операторы для разной функциональности.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: F# hello wordl: почему два оператора вместо одного?
От: MadHuman Россия  
Дата: 22.05.18 06:12
Оценка: 2 (1)
Здравствуйте, takTak, Вы писали:

T>просто интересно: какое у f# предназначение? для чего его используют, где не подходит c#?

ссылка
Re[3]: F# hello wordl: почему два оператора вместо одного?
От: takTak  
Дата: 22.05.18 06:41
Оценка:
T>>просто интересно: какое у f# предназначение? для чего его используют, где не подходит c#?
MH>ссылка

спасибо, конечно, но хотелось бы услышать про какие-то примеры из этой реальной жизни: типа, код на C# исполнялся медленнее в Х раз или потреблял в Y раз больше памяти, или таких экстремальных примеров нет?
Re[4]: F# hello wordl: почему два оператора вместо одного?
От: Jack128  
Дата: 22.05.18 07:38
Оценка:
Здравствуйте, takTak, Вы писали:

T>спасибо, конечно, но хотелось бы услышать про какие-то примеры из этой реальной жизни: типа, код на C# исполнялся медленнее в Х раз или потреблял в Y раз больше памяти, или таких экстремальных примеров нет?

Таких — естественно нет. Оба языка сидят на одном рантайме, причем рантайм — объектоориентированный, то есть ближе к C#. В терминах производительности C# всегда будет не хуже F#. А вот в плане выразительности кода — это вопрос.
Re[4]: F# hello wordl: почему два оператора вместо одного?
От: MadHuman Россия  
Дата: 22.05.18 08:08
Оценка:
Здравствуйте, takTak, Вы писали:

T>спасибо, конечно, но хотелось бы услышать про какие-то примеры из этой реальной жизни: типа, код на C# исполнялся медленнее в Х раз или потреблял в Y раз больше памяти, или таких экстремальных примеров нет?


как-то я уже высказывал свои впечатления от F# тут
Автор: MadHuman
Дата: 13.03.18

по производительности — C# обычно будет быстрее. если надо выжимать макс. скорость — то лучше си-шарп.
ф-шарп берёт именно способностью лаконично выражать мысль, делать проще сложные вещи и тем самым мозг одного человека способен котнролировать более сложный код. точнее код как раз становится проще, и за счет этого можно реализовывать и контролировать (держать в голове нюансы) более сложный функционал.
из сходу вспоминаемых преимуществ (то что я реально ощущаю на практике):
— МОЩНЫЙ паттерн-матчинг. это просто убойная вещь.
— простая работа с функциями (удобно строить конвееры, композировать их, декларировать внтури функций, передавать и тп).
— способен сам выводить типы функций и аргументов, нет необходимости писать зачастую длиннющие аннотации типов.
— функциональное программирование.
— спустя время когда читаеш то что написал и уже забыл — быстрее заново понимаеш логику.
Re[5]: F# hello wordl: почему два оператора вместо одного?
От: takTak  
Дата: 22.05.18 08:35
Оценка:
T>>спасибо, конечно, но хотелось бы услышать про какие-то примеры из этой реальной жизни: типа, код на C# исполнялся медленнее в Х раз или потреблял в Y раз больше памяти, или таких экстремальных примеров нет?

MH>как-то я уже высказывал свои впечатления от F# тут
Автор: MadHuman
Дата: 13.03.18

MH>по производительности — C# обычно будет быстрее. если надо выжимать макс. скорость — то лучше си-шарп.
MH>ф-шарп берёт именно способностью лаконично выражать мысль, делать проще сложные вещи и тем самым мозг одного человека способен котнролировать более сложный код. точнее код как раз становится проще, и за счет этого можно реализовывать и контролировать (держать в голове нюансы) более сложный функционал.
MH>из сходу вспоминаемых преимуществ (то что я реально ощущаю на практике):
MH>- МОЩНЫЙ паттерн-матчинг. это просто убойная вещь.
MH>- простая работа с функциями (удобно строить конвееры, композировать их, декларировать внтури функций, передавать и тп).
MH>- способен сам выводить типы функций и аргументов, нет необходимости писать зачастую длиннющие аннотации типов.
MH>- функциональное программирование.
MH>- спустя время когда читаеш то что написал и уже забыл — быстрее заново понимаеш логику.

короче, если я правильно понял, для каких-то алгоритмов на стороне сервера F# имел бы смысл, для UI/frontenda- больше имел бы смысл C# , правильно?
Re[6]: F# hello wordl: почему два оператора вместо одного?
От: MadHuman Россия  
Дата: 22.05.18 08:44
Оценка:
Здравствуйте, takTak, Вы писали:

T>короче, если я правильно понял, для каких-то алгоритмов на стороне сервера F# имел бы смысл, для UI/frontenda- больше имел бы смысл C# , правильно?

в целом да. но и в UI/frontenda, могут быть сложные алгоритмы/подсистемы, тогда можно их реализацию вынести в отдельный проект на F#
Re[7]: F# hello wordl: почему два оператора вместо одного?
От: takTak  
Дата: 22.05.18 08:47
Оценка:
T>>короче, если я правильно понял, для каких-то алгоритмов на стороне сервера F# имел бы смысл, для UI/frontenda- больше имел бы смысл C# , правильно?
MH>в целом да. но и в UI/frontenda, могут быть сложные алгоритмы/подсистемы, тогда можно их реализацию вынести в отдельный проект на F#

а что, есть F# реализация под WPF(MVVM) типа Prism/Caliburn или что-то особенное под asp.net?
Re[8]: F# hello wordl: почему два оператора вместо одного?
От: MadHuman Россия  
Дата: 22.05.18 09:15
Оценка:
Здравствуйте, takTak, Вы писали:


T>>>короче, если я правильно понял, для каких-то алгоритмов на стороне сервера F# имел бы смысл, для UI/frontenda- больше имел бы смысл C# , правильно?

MH>>в целом да. но и в UI/frontenda, могут быть сложные алгоритмы/подсистемы, тогда можно их реализацию вынести в отдельный проект на F#

T>а что, есть F# реализация под WPF(MVVM) типа Prism/Caliburn или что-то особенное под asp.net?

незнаю. у нас в отдельном F# проекте (dll сборка в итоге) всё что имеет смысл там делать — делается.
затем сборка подключается к asp.net проекту и прочим и функционал из неё используется.
можно (есть шаблоны проектов) чтоб web-application на asp.net было на F# (контроллеры в частности), но мы не стали заморачиваться.
главное что сложные алгоритмы/подсистемы есть возможность выносить реализацию в отдельный проект на F#, и затем выставлять удобный интерфейс по использованию для других. Таким образом потому что основная (большая) часть была на C# и потом часть функционала стали выносить в отдельный проект F#.
Отредактировано 22.05.2018 9:17 MadHuman . Предыдущая версия .
Re[2]: F# hello wordl: почему два оператора вместо одного?
От: Mr.Delphist  
Дата: 22.05.18 09:50
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Я совсем не спец в F#, но, имхо, есть значительная разница между списком списков и списком элементов.

S>Т.е. [0;1];[2;3;4]] — совсем-совсем не то же самое, что и [0;1;2;3;4], и не то же самое, что [0;1];2;3;4].
S>Соответствнно, имеем разные операторы для разной функциональности.

Ага, похоже на то, спасибо!
Re[2]: F# hello wordl: почему два оператора вместо одного?
От: HrorH  
Дата: 23.05.18 10:58
Оценка:
Здравствуйте, Sinclair, Вы писали:


S>Я совсем не спец в F#, но, имхо, есть значительная разница между списком списков и списком элементов.

S>Т.е. [0;1];[2;3;4]] — совсем-совсем не то же самое, что и [0;1;2;3;4], и не то же самое, что [0;1];2;3;4].
S>Соответствнно, имеем разные операторы для разной функциональности.

А причем здесь список списков? Там идет конкатенация двух списков, и в результате получается новый список.
Надо на типы смотреть, там список целых чисел должен быть.
А :: это конструктор, в списке 2 конструктора :: и [].
В Haskell кстати используется : , а :: используется для аннотации типа, а в ML и следовательно F# наоборот.
Re: F# hello wordl: почему два оператора вместо одного?
От: HrorH  
Дата: 23.05.18 11:20
Оценка:
MD>Собственно, вопрос: в каких ситуациях может возникнуть та самая двусмысленность, из-за которой и пришлось ввести два разных оператора? Или это просто "исторически сложилось"?

Возьмите Yet Another Haskell Tutorial (YAHT)
и Харрисон Филд Функциональное программирование.
:: это конструктор. См. также 4.5.3 Recursive Datatypes в YAHT.
Re[2]: F# hello wordl: почему два оператора вместо одного?
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 24.05.18 06:10
Оценка:
Здравствуйте, HrorH, Вы писали:

HH>Возьмите Yet Another Haskell Tutorial (YAHT)

HH>и Харрисон Филд Функциональное программирование.
HH>:: это конструктор. См. также 4.5.3 Recursive Datatypes в YAHT.
А можно в двух простых словах немного пояснить что дает факт того, что :: — конструктор?
И сразу, а @ — это не конструктор? Если да, то почему?
Re[3]: F# hello wordl: почему два оператора вместо одного?
От: hardcase Пират http://nemerle.org
Дата: 24.05.18 08:59
Оценка: 12 (1)
Здравствуйте, Михаил Романов, Вы писали:

HH>>:: это конструктор. См. также 4.5.3 Recursive Datatypes в YAHT.

МР>А можно в двух простых словах немного пояснить что дает факт того, что :: — конструктор?
МР>И сразу, а @ — это не конструктор? Если да, то почему?

Список определен как рекурсивный тип данных (извиняюсь за синтаксис Nemerle):

variant list[T]
{
  | Cons { head : T; tail : list[T] }
  | Nil
}


:: — это сокращение для конструктора list[T].Cons. Слева от :: стоит значение head, а справа — tail.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: F# hello wordl: почему два оператора вместо одного?
От: HrorH  
Дата: 24.05.18 11:57
Оценка: 12 (1)
Здравствуйте, Михаил Романов, Вы писали:

МР>А можно в двух простых словах немного пояснить что дает факт того, что :: — конструктор?

МР>И сразу, а @ — это не конструктор? Если да, то почему?

Список можно представить как рекурсивный тип данных, там 2 конструктора :: и [].
Конструктор [] создает пустой список, а :: берет элемент и список и возвращает новый список.

Для меня эти конструкторы всегда были странными, т.к. это вроде бы функции, но у них нет тела.
Они имеют чисто синтаксический смысл, то есть с помощью них можно выстроить какую-то конструкцию Cons(1,Cons(2, Cons(3, []))),
а дальше уже все зависит от тех методов, которые будут работать с этой конструкцией.

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

При этом эти 2 конструктора — единственный способ создать список (в теории), остальные функции определены через них.
[1;2;3] это синтаксический сахар для Cons(1,Cons(2, Cons(3, []))).
Определяя рекурсивный тип мы получаем при этом возможность сопоставления с образцом по конструкторам.

Сам список является иммутабельным, при конкатенации 2-х списков, создается список, который физически имеет общий хвост со вторым списком.


Но честно говоря, если кого-то интересует функциональщина, лучше почитать что-нибудь, причем лучше сразу на Haskell
(Еще могу вспомнить Gentle introduction здесь.)
Там не обойдешься 2-мя словами и вопросами на форуме (который функциональщики похоже покинули?), там большое количество разных знаний и областей.
Re[9]: F# hello wordl: почему два оператора вместо одного?
От: igor-booch Россия  
Дата: 24.05.18 12:21
Оценка:
MH>незнаю. у нас в отдельном F# проекте (dll сборка в итоге) всё что имеет смысл там делать — делается.

Можете вкратце описать какая логика в проекте F#?
Может парсинг, перевод данных из одной структуры в другую.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.