
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
код файлов, которые выше по порядку, может использоваться файлами, которые ниже, но ненаоборот

Владислав
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

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

Pavel
08.01.2018
05:47:21
а потом переучивать?

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

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

Klei
08.01.2018
06:32:09

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.

Pavel
08.01.2018
07:08:40

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
разница в примерах только в том что у меня нет ResizeArray

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

Pavel
08.01.2018
07:24:46
но вот переписанного в нормальный вид этого примера в книге почему то все же на последовало

Klei
08.01.2018
07:27:11

Pavel
08.01.2018
07:34:33

Klei
08.01.2018
07:38:09
Я в режиме ридонли до вечера.

Pavel
08.01.2018
07:44:04
сжирает до ляма записей без проблем

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

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