@Fsharp_chat

Страница 448 из 772
Bogdan
07.01.2018
21:12:46
да

кстати

Tony
07.01.2018
21:12:52
Bogdan
07.01.2018
21:13:17
хммм..

Google
Владислав
07.01.2018
21:13:23
А подскажите) пишу в ВС , но там вроде с порядком файлов беда какая-то... я так понимаю для организации файлов нужен FAKE?

Bogdan
07.01.2018
21:13:25
рекурсивные объкты

Tony
07.01.2018
21:13:31
вопрос-то не в функция-нефункция, а в том, почему не компилируется

Владислав
07.01.2018
21:14:54
Я добавил файл, но ВС его не видел, пока в fsproj не поменял порядок (наверное так было)

Tony
07.01.2018
21:15:39
Владислав
07.01.2018
21:15:54
Да, не понимало, что он к меня есть

Tony
07.01.2018
21:16:10
порядок файлов важен, там можно в контекстном меню выбрать Move Up или Move Down

Владислав
07.01.2018
21:16:11
Я читал что-то про порядок файлов

А fake для чего нужен?

Tony
07.01.2018
21:16:48
код файлов, которые выше по порядку, может использоваться файлами, которые ниже, но ненаоборот

А fake для чего нужен?
FAKE — это F# Make. это чтоб билды собирать )

Владислав
07.01.2018
21:17:49
А что значит собирать? В exe или как? ВС этого не делает?

Google
Tony
07.01.2018
21:17:52
А что значит собирать? В exe или как? ВС этого не делает?
ну да, в exe или dll. VS не делает, это делает MSBuild, а VS только говорит MSBuild, что надо сделать. FAKE по сути делает то же самое, только ты можешь на F# написать MSBuild инструкции, как тебе нужно собрать сборку или что ты там хочешь собрать (+ запустить тесты, задеплоить результать куда-нибудь и так далее).

Владислав
07.01.2018
21:20:13
Ааа, спасибо!

Bogdan
07.01.2018
21:20:40
а теперь можно поподробнее про рекурсивные объекты?)

Сергей
07.01.2018
21:26:42
вот
кстати ничего не мешает узнать у автора, он же вроде тут сидит

Pavel
08.01.2018
03:01:28
скрин с книги
c# какойто

Klei
08.01.2018
05:42:14
c# какойто
Это вроде бы начало обучения, поэтому незачем читающего кроме основной темы дополнительно грузить потоками, свертками и т.п.

Klei
08.01.2018
05:47:58
Он не учит "неправильно", он показывает пример кода, который будет понятен читающему с императивным опытом.

Т.е. показывает переложение известных конструкций на f#.

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

Pavel
08.01.2018
06:09:56
Он не учит "неправильно", он показывает пример кода, который будет понятен читающему с императивным опытом.
нельзя изучить чтото новое основываясь на старом опыте. ты просто изучишь старое в новой обертке.

хотя подмена автора занятна

Klei
08.01.2018
06:13:37
И как надо переписать это пример в ФП, если в данном месте дается пример ResizeArray? "Другим типом, который стоит упомянуть, является тип List<_> библиотеки .NET. Во избежание конфликта имен в библиотеке F# этот тип переименован в ResizeArray. "

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

Pavel
08.01.2018
06:19:34
раздел называется "2.2. структура данных: одномерный массив" причем в оригинале они еще и почему то рекурсивные. возвращается вообще string list (почему-то). зачем там вообще ResizeArray - никому неясно

скачал с оф сайта код к книге

Google
Pavel
08.01.2018
06:27:01
// "Неровные" многомерные массивы // ------------------------------ // Строим треугольник Паскаля let pascal n = let rec pas L n = let A::t = L in if n = 0 then L else pas (((1::[for i in 1..(List.length A-1) -> A.[i-1]+A.[i]])@[1])::L) (n-1) pas [[1;1]] n pascal 10;;

в каком месте это массив? чему книга учит?

Klei
08.01.2018
06:28:05
раздел называется "2.2. структура данных: одномерный массив" причем в оригинале они еще и почему то рекурсивные. возвращается вообще string list (почему-то). зачем там вообще ResizeArray - никому неясно
Чтобы накапливать состояние не забивая человеку голову fold-ом, я уже года два с половиной агитирую с разной интенсивностью за F#, и у большинства начинаются адовые затупы на reduce/fold/(и даже aggregate для C#). Рецепта быстрого объяснения этой штуки я не нашел, ощущение, что человека просто надо оставить на несколько часов/дней рефлексировать, чтобы до него это дошло. Думаю Сошников столкнувшись с этим на практике пришел к аналогичным выводам (либо почерпнул их из другой ФП литературы)

в каком месте это массив? чему книга учит?
Здесь согласен, хотя контекста не видел.

Pavel
08.01.2018
06:29:45
там не нужно накапливать состояние, это просто построение массива/списка

Klei
08.01.2018
06:32:09
там не нужно накапливать состояние, это просто построение массива/списка
Массив неопределенной длины? -> ResizeArray Список? А чем это не накопление состояния?

Pavel
08.01.2018
06:33:07
ResizeArray - зачем?

памяти и процессора много? а потом говорят что F# медленный и жрет много

"Список? А чем это не накопление состояния?" уточню что для построения списка ResizeArray для накопления состояния не нужен

да и fold не нужен если что

Klei
08.01.2018
06:45:44
Это пример для ResizeArray (много восклицательных знаков), случаев когда можно его осмысленно использовать в F# не так много, и все подобные примеры будут достаточно велики, чтобы уделять им много места в книге про ФП. Про память и проц не понял, при ResizeArray вроде может быть даже поэкономнее. Про fold: Смотря как строить список. // Хотя все равно под капотом будет крутиться его разновидность.

Pavel
08.01.2018
06:48:56
"Про память и проц не понял, при ResizeArray вроде может быть даже поэкономнее." в конце List.ofSeq. весело гоняем по коллекциям

Klei
08.01.2018
06:49:57
Pavel
08.01.2018
06:50:54
он и так создается сразу и за 1 проход. профит то в чем?

Klei
08.01.2018
06:52:04
Как это за один? Сначала получится инверсированный список, который придется сворачивать обратно.

Pavel
08.01.2018
06:52:10
нет

сразу

Klei
08.01.2018
06:52:26
...

Как?

Ты сначала читаешь.

Google
Klei
08.01.2018
06:52:45
Соответственно первый окажется в конце.

Pavel
08.01.2018
06:53:03
ты читаешь и сразу ложишь в список. последовательно

Klei
08.01.2018
06:53:19
И что у тебя будет в Head?

Последний элемент.

Pavel
08.01.2018
06:54:10
первый. ты просто списки не умеешь готовить (вот поэтому я и говорю что нельзя с императивных примеров учиться)

Klei
08.01.2018
06:55:02
Пример в студию.

Для начала кода, который за один проход считает у пользователя список.

Pavel
08.01.2018
06:58:30
эх....

let ReadLines() = let rec loop() = [ match Console.ReadLine() with | "." -> () | x -> yield x yield! loop() ] loop()

Klei
08.01.2018
07:00:42
По твоему под капотом этой штуки не будет инвертированного списка?

Pavel
08.01.2018
07:01:55
а какие причины для его появления?

я ж могу и seq объявить. откуда там инвертирование появится?

Klei
08.01.2018
07:03:29
Ну может быть такие: что на момент yield x она не сможет его никуда присоединить, т.к. окончания списка еще не существует. Соответственно придется содержать некое скрытое состояние.

В seq тоже самое будет.

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

Ибо это уже адовые штуки которые не должны покидать FSharp.Core.

Klei
08.01.2018
07:11:09
Ну список можно условно представить в виде: { Value : 'a Tail : 'a list } Если сделать Tail изменяемым в рамках класса/либы и т.п., то можно юзать хук, в виде установки Tail после создания списка. В этом случае единоразовый проход вполне возможен.

Pavel
08.01.2018
07:13:56
ты сейчас о List.ofSeq?

Klei
08.01.2018
07:15:14
О нем в том числе.

Google
Pavel
08.01.2018
07:15:43
Ибо это уже адовые штуки которые не должны покидать FSharp.Core.
ну так оно в нем и живет. в чем проблема то?

разница в примерах только в том что у меня нет ResizeArray

Klei
08.01.2018
07:22:14
В том, что это оптимизации свойственные компилятору, а не смертным. Если представить список в виде DU, то подобное решение будет недоступно.

Еще раз напоминаю, пример про ResizeArray.

Pavel
08.01.2018
07:24:46
Еще раз напоминаю, пример про ResizeArray.
ну я уже понял что в книге каша. этого примера вообще не должно было быть

но вот переписанного в нормальный вид этого примера в книге почему то все же на последовало

Klei
08.01.2018
07:27:11
ну я уже понял что в книге каша. этого примера вообще не должно было быть
ResizeArray периодически используется, и почти никогда не покидает пределы функции. Поэтому хотя какой-то пример нужен. // Можно было бы рандомную перестановку на нем показать, пример был бы лучше.

Klei
08.01.2018
07:38:09
доступно. правда в стек упрется
Я про невозможность изменения tail говорю.

Я в режиме ридонли до вечера.

Pavel
08.01.2018
07:44:04
Я про невозможность изменения tail говорю.
type A = | X of string * A seq | Null let ReadLines() = let rec loop() = seq { match Console.ReadLine() with | "." -> yield Null | x -> yield X (x, loop()) } loop()

сжирает до ляма записей без проблем

Aleksander
08.01.2018
07:59:49
А мне, если честно, без рекурсии больше нравится. Как-то так: seq { while true do yield (System.Console.ReadLine()) } |> Seq.takeWhile ((<>) ".") |> Seq.toList

Pavel
08.01.2018
08:04:59
тоже вариант

Klei
08.01.2018
08:52:49
type A = | X of string * A seq | Null let ReadLines() = let rec loop() = seq { match Console.ReadLine() with | "." -> yield Null | x -> yield X (x, loop()) } loop()
К чему пример? Не говоря уже о том, что она не материализованна. Вот каноническое определение list: type 'a MyList = | Empty | MyList of head : 'a * tail : 'a MyList В один проход это считать невозможно.

Aleksander
08.01.2018
09:30:37
Evgeniy
08.01.2018
09:42:19
F# Weekly #1, 2018 – F# Applied II #fsharp https://sergeytihon.com/2018/01/07/f-weekly-1-2018-f-applied-ii/

Friedrich
08.01.2018
10:01:08
Лисп - динамически типизирован
Можно сделать статически типизированный лисп.

А разве на f# есть такие же персистентные коллекции в кложуре из коробки?
Из коробки нету, но были где-то в FSharpx чтоли. Ну, в общем, промышленная реализация есть, если она вам нужна.

А чем они лучше system.collection.immutable?
А я что-то там не вижу персистентного вектора, к примеру.

Страница 448 из 772