@Fsharp_chat

Страница 449 из 772
Pavel
08.01.2018
10:52:46
К чему пример? Не говоря уже о том, что она не материализованна. Вот каноническое определение list: type 'a MyList = | Empty | MyList of head : 'a * tail : 'a MyList В один проход это считать невозможно.
type 'a MyList = | Empty | MyList of 'a * 'a MyList let ReadLines() = let rec loop f () = let rec loop2 cont = match Console.ReadLine() with | "." -> cont Empty | x -> loop2 (cont << f x) loop2 id loop (fun a b -> MyList(a, b)) ()

делов то

Oleg
08.01.2018
11:05:25
type 'a MyList = | Empty | MyList of 'a * 'a MyList let ReadLines() = let rec loop f () = let rec loop2 cont = match Console.ReadLine() with | "." -> cont Empty | x -> loop2 (cont << f x) loop2 id loop (fun a b -> MyList(a, b)) ()
Так вообще нечитаемо. Да ещё на ошибку похоже - зачем loop рекурсивная? Зачем в неё loop2 вложена?

Pavel
08.01.2018
11:06:55
Так вообще нечитаемо. Да ещё на ошибку похоже - зачем loop рекурсивная? Зачем в неё loop2 вложена?
мало ли что там нечитаемо. зато стек не падает. и с какой стати лишний "rec" ошибкой стал?

Google
Pavel
08.01.2018
11:10:22
правильный quicksort тоже не особо читаем в отличии от красивого но падучего

Oleg
08.01.2018
11:10:41
мало ли что там нечитаемо. зато стек не падает. и с какой стати лишний "rec" ошибкой стал?
Логическая ошибка, кроме того это вообще не цикл. Стиль плохой, что хотел сказать автор?

Oleg
08.01.2018
11:14:21
есть варианты лучше?
С компа напишу, с телефона нет ?

Alex
08.01.2018
12:34:14
Подскажите пожалуйста, тайп провайдеры (не те которые erased) на net core 2 работают или все еще нет ?

Klei
08.01.2018
18:08:41
type 'a MyList = | Empty | MyList of 'a * 'a MyList let ReadLines() = let rec loop f () = let rec loop2 cont = match Console.ReadLine() with | "." -> cont Empty | x -> loop2 (cont << f x) loop2 id loop (fun a b -> MyList(a, b)) ()
Замкнуть весь список в обратном порядке внутри продолжений и презентовать это как однопроходное составление... Да вам батенька в маркетинг надо. Чем этот способ лучше создания реверсированного списка? Под капотом опять будут созданы объекты содержащие ссылки на item и следующую функцию, что сущностно ничем не отличается от обычно списка. С таким же успехом можно было создать "альтернативный тип" MyList1, и записать в него первое прохождение. После чего загнать его в оригинальный MyList. К этому стоит прибавить оверхед связанный с .NET делегатами, резкое усложнение дебага, ввиду практической недоступности состояния, глубокую вложенность и невнятную читаемость даже для подготовленного пользователя.

А я что-то там не вижу персистентного вектора, к примеру.
А ImmutableList разве не является персистентным вектором?

Alexander
08.01.2018
18:38:34
Я может щас полный бред скажу, но нельзя разве собрать проекты с разными вариантами и глянуть на них через рефлектор. Всёж на один IL собирается или я не прав?

Alexander
08.01.2018
18:40:51
про то каким путём идёт билд массива

Klei
08.01.2018
18:43:41
про то каким путём идёт билд массива
// У меня телеграм глючит? Какой-то скачок в теме. Какой массив?

Alexander
08.01.2018
18:45:26
Может я не уловил мысль когда пробежался глазами по диалогу, но вы вроде бы спорили каким путём лист собиратется. Ну вот я и подумал что на IL сразу будет видно что к чему.

Klei
08.01.2018
18:53:43
Вариант конечно, но в целом обсуждается вопрос возможности сборки списка неопределённой длины без создания промежуточных структур данных. Без мутабельности внутри списка это сделать невозможно.

Google
Klei
08.01.2018
18:54:05
Лучше залезть в FSharp.Core и посмотреть как это сделали умные дяди.

Pavel
08.01.2018
19:05:51
let ReadLines() = let rec loop () = match Console.ReadLine() with | "." -> Empty | x -> MyList(x, loop()) loop ()

проход 1 реверса нет

и эмулируется им не построение списка а стек вызовов

ну а тоо что он медленее это другой вопрос

Klei
08.01.2018
19:13:27
let ReadLines() = let rec loop () = match Console.ReadLine() with | "." -> Empty | x -> MyList(x, loop()) loop ()
Ты съэмулировал стек вызовов в виде функции. Это то же самое накапливаемое состояние. Проход в одну сторону строит убер функцию, потом она исполняется, в процессе разворачивая стек. С моей точки зрения прохода два.

Pavel
08.01.2018
19:46:11
https://twitter.com/migueldeicaza/status/950425632311267328

Даже не знаю, хорошие это новости или плохие :)

Evgeniy
08.01.2018
20:01:29
Интересно.

A64m
08.01.2018
20:47:06
Лучше залезть в FSharp.Core и посмотреть как это сделали умные дяди.
а там где надо список в один проход собирать в map всяких он мутабельный. Да и не только в f# так

Friedrich
09.01.2018
02:42:10
А ImmutableList разве не является персистентным вектором?
Неа, я посмотрел в сорцах — кажется, это AVL-дерево?

Klei
09.01.2018
02:57:32
Неа, я посмотрел в сорцах — кажется, это AVL-дерево?
А что подразумевается под персистентным вектором? Если вещь условно похожая по поведению на ResizeArray, то ImmutableList презентуют именно так.

1::loop() - это сколько проходов?
По моему спор вырождается до шашечек, тебе придется накопить состояние, будет это список, функция или стек выполнения мне неважно.

Pavel
09.01.2018
03:03:19
и в каком месте тут копится состояние? здесь список строится. состояние копить это создать RezsizeArray и кидать в него промежуточные данные. или в случае аккумулятора. но даже если опустить вопрос состояния это все равно 1 проход без реверса

Klei
09.01.2018
03:11:59
В стеке, множество функций, что будут запущены в процессе чтения является таким же состоянием, только менее явным для новичка.

Pavel
09.01.2018
03:31:52
В стеке, множество функций, что будут запущены в процессе чтения является таким же состоянием, только менее явным для новичка.
т.е. любая частичная функция это состояние и по факту ты занимаешься не функциональным программированием а составляешь композиции состояний? :)

Klei
09.01.2018
03:35:52
т.е. любая частичная функция это состояние и по факту ты занимаешься не функциональным программированием а составляешь композиции состояний? :)
Мыслить в такой трактовке сложновато, но в принципе да. Можно сказать и так. Если бы я хотел в чистое эльфийское ФП с игнорированием мироздания я бы писал на лиспе.

Friedrich
09.01.2018
03:47:08
А что подразумевается под персистентным вектором? Если вещь условно похожая по поведению на ResizeArray, то ImmutableList презентуют именно так.
Я под персистентным вектором понимаю вот эту структуру данных: - http://hypirion.com/musings/understanding-persistent-vector-pt-1 - http://hypirion.com/musings/understanding-persistent-vector-pt-2 Первоначально она была реализована, кажется, в Clojure (во всяком случае, это первая реализация, про которую я услышал), а дальше портирована, например, в Scala или FSharpx, который обсуждали выше.

Google
Aleksey
09.01.2018
06:16:12
С чего это частичная функция - состояние? Эффект - да, но не состояние никак

Klei
09.01.2018
06:38:54
С чего это частичная функция - состояние? Эффект - да, но не состояние никак
Моя мысль сводится к тому, что создавая путем композиции функций некую "итоговую" функцию, мы по прежнему накапливаем состояние, но теперь в виде функции. Формулировка данная выше (https://t.me/Fsharp_chat/44835) не моя, и я ее признал с натяжкой.

Aleksey
09.01.2018
06:39:54
Состояния не больше, чем в математической композиции морфизмов

Т.е. нет состояния

Aleksey
09.01.2018
06:42:39
Передача результата в качестве аргумента выглядит как состояние только с точки зрения реализации конкретного ЯП. Семантичнски никакого состояния нет

Klei
09.01.2018
06:43:25
это что?
Там же не про частичное применение.

Aleksey
09.01.2018
06:43:38
И вообще композиция функций никакого отношения к "в стеке" не имеет

Последовательное применение функций - не композиция

Ну и покапитанствую: частичная функция, это функция, определённая не для всех возможных значений аргументов

Pavel
09.01.2018
06:46:48
это "cont << f x" что?

Aleksey
09.01.2018
06:48:02
Арность у f какая?

Aleksey
09.01.2018
06:51:29
Хмм. В F# у композиции выше приоритет, чем у применения?

Pavel
09.01.2018
06:51:44
нет

Aleksey
09.01.2018
06:52:44
Но в коде выше у f арность - 1. В таком случае применённую f нельзя композить

Pavel
09.01.2018
06:53:08
вообще то 2

Aleksey
09.01.2018
06:53:09
Хотя она может же функцию вернуть

Всё, распарсил

Google
Klei
09.01.2018
06:54:07
Я рассуждаю в контексте F#, поэтому для меня композиция или частичное применение функций будут сведены к созданию условного делегата от двух переменных. Если переходить к формальной стороне дела, то скорее всего я не прав, но я туда и не лезу, ибо образование не позволяет. Но заменять явный список, на функции и утвержать, что мы избавились от проблем в реальном мире - ошибочно.

Aleksey
09.01.2018
06:54:42
Не нужно строить лишних аналогий в голове

Композиция функций - не передача состояния

И у частично примененной функции нет никакого состояния, если замкнутое значение - иммутабельное

Если мутабельное, то у частично применённой функции "состояние" - нарушающее referential transparency - может быть

На всякий случай повторю: частично примененная функция и частичная функция - разные вещи и путать их нельзя

(выключил режим "зануда")

Klei
09.01.2018
07:08:32
Еще раз, чтобы все друг друга поняли и никто не забросил нечего на вентилятор: * мы обсуждали вопрос одноразового построения списка без создания дополнительных структур и без проблем на стеке. * в процессе обсуждения был предложен вариант через продолжения. * я попытался объяснить, что при таком решении под капотом будет построена цепочка ссылающихся однонаправленно делегатов. * в просессе объяснения были использованы термины схожие с общепринятыми, но в некоторых местах от них отличающиеся (для удобства и краткости, а не для введения в заблуждение). * по итогам обсуждения мы друг друга поняли, выработанную в процессе обсуждения терминологию никто выплескивать в большой мир не планировал. * скобочка закрывается, скоп лишается локальных переменных, все.

Evgeniy
09.01.2018
07:11:45
Чудно.

Видели уже? https://github.com/fsprojects/Mechanic

tl;dr The idea is to create a dotnet core tool that uses the FSharp.Compiler.Service to find a valid file order.

Даже не знаю, хорошие это новости или плохие :)
k_cieslak Yeah, talked with Don about it some time ago. He seemed excited As in - it actually means more time on F#, no unrelated research stuff

Привет.

n06rn
09.01.2018
07:39:14
Привет.
Привет)

необычно что приветствуешь)

Evgeniy
09.01.2018
07:39:43
Я бот.

n06rn
09.01.2018
07:41:39
Я бот.
эм, разве? Вот другого человека при входе не приветствовал.

Google
n06rn
09.01.2018
07:42:26
Кого это?
ну вот выше @nastyanastya787

она смотрю присоединилась к чату, на нее никакой реакции не было.

Evgeniy
09.01.2018
07:43:03
А если не найдет?
Должен показаться ошибку и подсказать, как поправить.

n06rn
09.01.2018
07:43:32
Пропустил!
такой себе бот получается)

Vlad
09.01.2018
07:45:31
такой себе бот получается)
if rand.Next() % 2 = 0 then Greet()

Анастасия
09.01.2018
07:55:10
@nastyanastya787 Привет!
Привет привет )

Roman
09.01.2018
07:55:42
Я не бот
Это про @gsomix

Evgeniy
09.01.2018
08:05:23
https://github.com/fsharp/fslang-suggestions/issues/506#issuecomment-356053292

Все еще обсуждают!

Anna
09.01.2018
08:07:07
Господа, а давайте придумаем, как value restriction по-русски обозвать. В русском переводе Пирса - "ограничение на значения", но это некрасиво и неправильно.

Pauline
09.01.2018
08:09:26
никак

Fill
09.01.2018
08:10:45
вэлью - рестрикшн

красиво и правильно

Nikolay
09.01.2018
08:11:24
Ограничение по значению, хз

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