Начал на досуге глядеть в 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] @ twoToFive
cons-оператор (два двоеточия) ещё и запрещает переставлять аргументы местами (слева всегда должен быть одиночный элемент, а справа — коллекция).
Собственно, вопрос: в каких ситуациях может возникнуть та самая двусмысленность, из-за которой и пришлось ввести два разных оператора? Или это просто "исторически сложилось"?
Re: F# hello wordl: почему два оператора вместо одного?
Здравствуйте, Mr.Delphist, Вы писали:
MD>Собственно, вопрос: в каких ситуациях может возникнуть та самая двусмысленность, из-за которой и пришлось ввести два разных оператора? Или это просто "исторически сложилось"?
Перегрузка методов F# вроде бы невозможна из-за системы типов. Скорее всего это относится и к операторам.
Если нам не помогут, то мы тоже никого не пощадим.
Re: F# hello wordl: почему два оператора вместо одного?
Здравствуйте, Mr.Delphist, Вы писали:
MD>Внутренний перфекционист спрашивает: а зачем два оператора, :: и @, если можно было бы оставить и один из них?
это просто разные по смыслу операторы. каждый удобен в своём случае.
:: — добавляет в голову списка один элемент. это мнгновенная операция.
1 :: [2;3;4] -> [1;2;3;4]
@ — конкатенация двух списков.
list1 @ list2
операция может быть долгая, так как поэлементно с конца list1 добавляет элементы к list2.
в принципе можно выразить один через другой, но для удобства лучше 2 отдельных.
Re: F# hello wordl: почему два оператора вместо одного?
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: почему два оператора вместо одного?
T>>просто интересно: какое у f# предназначение? для чего его используют, где не подходит c#? MH>ссылка
спасибо, конечно, но хотелось бы услышать про какие-то примеры из этой реальной жизни: типа, код на C# исполнялся медленнее в Х раз или потреблял в Y раз больше памяти, или таких экстремальных примеров нет?
Re[4]: F# hello wordl: почему два оператора вместо одного?
Здравствуйте, takTak, Вы писали:
T>спасибо, конечно, но хотелось бы услышать про какие-то примеры из этой реальной жизни: типа, код на C# исполнялся медленнее в Х раз или потреблял в Y раз больше памяти, или таких экстремальных примеров нет?
Таких — естественно нет. Оба языка сидят на одном рантайме, причем рантайм — объектоориентированный, то есть ближе к C#. В терминах производительности C# всегда будет не хуже F#. А вот в плане выразительности кода — это вопрос.
Re[4]: F# hello wordl: почему два оператора вместо одного?
Здравствуйте, takTak, Вы писали:
T>спасибо, конечно, но хотелось бы услышать про какие-то примеры из этой реальной жизни: типа, код на C# исполнялся медленнее в Х раз или потреблял в Y раз больше памяти, или таких экстремальных примеров нет?
как-то я уже высказывал свои впечатления от F# тут
по производительности — C# обычно будет быстрее. если надо выжимать макс. скорость — то лучше си-шарп.
ф-шарп берёт именно способностью лаконично выражать мысль, делать проще сложные вещи и тем самым мозг одного человека способен котнролировать более сложный код. точнее код как раз становится проще, и за счет этого можно реализовывать и контролировать (держать в голове нюансы) более сложный функционал.
из сходу вспоминаемых преимуществ (то что я реально ощущаю на практике):
— МОЩНЫЙ паттерн-матчинг. это просто убойная вещь.
— простая работа с функциями (удобно строить конвееры, композировать их, декларировать внтури функций, передавать и тп).
— способен сам выводить типы функций и аргументов, нет необходимости писать зачастую длиннющие аннотации типов.
— функциональное программирование.
— спустя время когда читаеш то что написал и уже забыл — быстрее заново понимаеш логику.
Re[5]: F# hello wordl: почему два оператора вместо одного?
T>>спасибо, конечно, но хотелось бы услышать про какие-то примеры из этой реальной жизни: типа, код на C# исполнялся медленнее в Х раз или потреблял в Y раз больше памяти, или таких экстремальных примеров нет?
MH>как-то я уже высказывал свои впечатления от F# тут
MH>по производительности — C# обычно будет быстрее. если надо выжимать макс. скорость — то лучше си-шарп. MH>ф-шарп берёт именно способностью лаконично выражать мысль, делать проще сложные вещи и тем самым мозг одного человека способен котнролировать более сложный код. точнее код как раз становится проще, и за счет этого можно реализовывать и контролировать (держать в голове нюансы) более сложный функционал. MH>из сходу вспоминаемых преимуществ (то что я реально ощущаю на практике): MH>- МОЩНЫЙ паттерн-матчинг. это просто убойная вещь. MH>- простая работа с функциями (удобно строить конвееры, композировать их, декларировать внтури функций, передавать и тп). MH>- способен сам выводить типы функций и аргументов, нет необходимости писать зачастую длиннющие аннотации типов. MH>- функциональное программирование. MH>- спустя время когда читаеш то что написал и уже забыл — быстрее заново понимаеш логику.
короче, если я правильно понял, для каких-то алгоритмов на стороне сервера F# имел бы смысл, для UI/frontenda- больше имел бы смысл C# , правильно?
Re[6]: F# hello wordl: почему два оператора вместо одного?
Здравствуйте, takTak, Вы писали:
T>короче, если я правильно понял, для каких-то алгоритмов на стороне сервера F# имел бы смысл, для UI/frontenda- больше имел бы смысл C# , правильно?
в целом да. но и в UI/frontenda, могут быть сложные алгоритмы/подсистемы, тогда можно их реализацию вынести в отдельный проект на F#
Re[7]: F# hello wordl: почему два оператора вместо одного?
T>>короче, если я правильно понял, для каких-то алгоритмов на стороне сервера F# имел бы смысл, для UI/frontenda- больше имел бы смысл C# , правильно? MH>в целом да. но и в UI/frontenda, могут быть сложные алгоритмы/подсистемы, тогда можно их реализацию вынести в отдельный проект на F#
а что, есть F# реализация под WPF(MVVM) типа Prism/Caliburn или что-то особенное под asp.net?
Re[8]: F# hello wordl: почему два оператора вместо одного?
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#.
Здравствуйте, 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: почему два оператора вместо одного?
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: почему два оператора вместо одного?
MD>Собственно, вопрос: в каких ситуациях может возникнуть та самая двусмысленность, из-за которой и пришлось ввести два разных оператора? Или это просто "исторически сложилось"?
Возьмите Yet Another Haskell Tutorial (YAHT)
и Харрисон Филд Функциональное программирование.
:: это конструктор. См. также 4.5.3 Recursive Datatypes в YAHT.
Re[2]: F# hello wordl: почему два оператора вместо одного?
Здравствуйте, HrorH, Вы писали:
HH>Возьмите Yet Another Haskell Tutorial (YAHT) HH>и Харрисон Филд Функциональное программирование. HH>:: это конструктор. См. также 4.5.3 Recursive Datatypes в YAHT.
А можно в двух простых словах немного пояснить что дает факт того, что :: — конструктор?
И сразу, а @ — это не конструктор? Если да, то почему?
Re[3]: F# hello wordl: почему два оператора вместо одного?
Здравствуйте, Михаил Романов, Вы писали:
HH>>:: это конструктор. См. также 4.5.3 Recursive Datatypes в YAHT. МР>А можно в двух простых словах немного пояснить что дает факт того, что :: — конструктор? МР>И сразу, а @ — это не конструктор? Если да, то почему?
Список определен как рекурсивный тип данных (извиняюсь за синтаксис Nemerle):
Здравствуйте, Михаил Романов, Вы писали:
МР>А можно в двух простых словах немного пояснить что дает факт того, что :: — конструктор? МР>И сразу, а @ — это не конструктор? Если да, то почему?
Список можно представить как рекурсивный тип данных, там 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: почему два оператора вместо одного?
MH>незнаю. у нас в отдельном F# проекте (dll сборка в итоге) всё что имеет смысл там делать — делается.
Можете вкратце описать какая логика в проекте F#?
Может парсинг, перевод данных из одной структуры в другую.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания http://rsdn.ru/Info/rules.xml