@Fsharp_chat

Страница 239 из 772
Friedrich
21.07.2017
14:51:51
Vasily
21.07.2017
14:52:36
Опять же, смутило то, что нет внятной доменной модели

Все размазано по файлам ровным слоем

Oleg
21.07.2017
14:52:52
В общем-то, данный код иллюстрирует одну из проблем F# - нет внятных стайлгайдов
Забыл сразу сказать, изучал язык с его идиомами. Многое унёс в c#

Google
Friedrich
21.07.2017
14:53:20
Опять же, смутило то, что нет внятной доменной модели
А можешь проиллюстрировать? Что бы ты назвал доменной моделью для данной программы, какие сущности там могут быть?

Vasily
21.07.2017
14:53:26
Когда есть описание предметной области - жить веселее

Например

Friedrich
21.07.2017
14:53:31
Согласен.

Vasily
21.07.2017
14:53:53
Для билд системы основообразующим объектом обычно является таск

Oleg
21.07.2017
14:54:12
Опять же, смутило то, что нет внятной доменной модели
Над проблемой думал, один раз рефакторил серьёзно. До состояния "вроде хорошо". Но все равно рад критике

Vasily
21.07.2017
14:54:51
Таски в свою очередь могут выполнять наборы операций

Vasily
21.07.2017
14:56:01
[<CustomEquality;CustomComparison>] type Target = | FileTarget of File | PhonyAction of string with member internal this.ShortName = match this with | FileTarget file -> file.Name | PhonyAction name -> name member internal this.FullName = match this with | FileTarget file -> file.FullName | PhonyAction name -> name override x.Equals(yobj) = match yobj with | :? Target as y -> stringCompare.Equals (x.FullName, y.FullName) | _ -> false override x.GetHashCode() = stringCompare.GetHashCode x.FullName interface System.IComparable with member x.CompareTo y = match y with | :? Target as y -> stringCompare.Compare(x.FullName, y.FullName) | _ -> invalidArg "y" "cannot compare target to different types" // structures, database processor and store

Oleg
21.07.2017
14:56:09
Для билд системы основообразующим объектом обычно является таск
Мне не нравится концепция таргета, слишком на файл завязана. Но не было возможности и аудитории побрейнштормить

Vasily
21.07.2017
14:56:11
Доменной моделью я бы это называть не стал

Таргет - это не обязательно файл

Это скорее набор артефактов

Google
Oleg
21.07.2017
14:57:38
Но я бы хотел такой таргет как отправленное письмо-уведомление

Vasily
21.07.2017
14:57:43
Не вопрос

Oleg
21.07.2017
14:57:52
Как?

Vasily
21.07.2017
14:58:06
Артефакт можно рассматривать как param-> unit

Фри монадки, вот это вот все

Oleg
21.07.2017
14:59:41
Интересно, посмотрю. У меня было опасение, что нам важно дотянуться до артефакта, например проверить наличие

Vasily
21.07.2017
15:00:13
Я бы в терминах билд системы под артефактом понимал набор действий

Точнее функцию некоторую

Oleg
21.07.2017
15:01:34
У меня главное - это артефакты и зависимости. Действия и порядок какбэ не важны

Vasily
21.07.2017
15:01:49
Зависимость - тоже функция

Точнее, набор функций

Типа unit->string скорее всего

Oleg
21.07.2017
15:02:34
Важно что зависимости записаны и можно отследить, нужна ли переборках

Vasily
21.07.2017
15:02:57
Их не всегда надо материализовывать

Oleg
21.07.2017
15:03:50
Их не всегда надо материализовывать
Да, и не все они материальны :)

Vasily
21.07.2017
15:04:21
Да, и не все они материальны :)
Поэтому и функцию надо

Короче

Билд система хорошо ложится в концепцию AST

Типа такого http://blog.ploeh.dk/2017/07/17/a-pure-command-line-wizard/

Кстати, продолжение плясок Симана с фри монадками

Google
Oleg
21.07.2017
15:06:52
Спасибо, почитаю

Vasily
21.07.2017
15:07:13
На концепцию билд системы ляжет зашибись

И вот это еще

http://fsharpforfunandprofit.com/posts/13-ways-of-looking-at-a-turtle-2/#way13

Oleg
21.07.2017
15:10:21
http://fsharpforfunandprofit.com/posts/13-ways-of-looking-at-a-turtle-2/#way13
Этим сайтом с любой страницы зачитываюсь

Vasily
21.07.2017
15:13:39
Я там указал страничку :)

Oleg
21.07.2017
15:17:38
Ну, до такого уровня не очень-то хочется спускаться. Все таки фшарп много даёт и сам является отличным интерпретатором. У меня только state и reader монады в рецепте

Vasily
21.07.2017
15:18:01
Нету там монад

Oleg
21.07.2017
15:18:05
Что за глюк, дважды сообщение отправлено

Vasily
21.07.2017
15:18:31
Точнее, очень императивная имплементация

Oleg
21.07.2017
15:19:32
RecipeBuilder? Где ж там императивный под?

Vasily
21.07.2017
15:20:15
А, вижу

Oleg
21.07.2017
15:21:49
Да этот код мне стоил половины седых волос :) По ночам, после рабочего дня, когда мозг вообще отказывается что-либо понимать ?

Ладно, большое спасибо Vasily @fvnever за критику и идеи

Friedrich
21.07.2017
15:32:36
@olegzee, тебе спасибо. Я всерьёз думаю, что на каких-нибудь небольших задачах попробую использовать эту билд-систему.

Oleg
21.07.2017
15:34:19
Ок, свежий и опытный взгляд - это что нужно

Ну тут понятно, что у человека в бэкграунде много цпп
Нет, нет и еще раз нет :) Последний раз в 99-м. Потом только C#

Oleg
21.07.2017
16:43:21
А как до F# добрались?
Через Немерле :)

Летучая
21.07.2017
17:14:50
Google
Летучая
21.07.2017
17:15:21
кстати вот интересно, а как параметрам функций хмл доки добавлять, если без <summary> и <param name="%"/> ?

Evgeniy
21.07.2017
17:22:33
Сайм добрался до DiffSharp. А до этого он немного коммитил в TensorFlowSharp.

Кажется, ему понравились нейронные сети. :)

> gbaydin added dsyme to hypelib/Hype Ну, точно!

Nikolay
21.07.2017
21:03:38
В F# оказывается такая магия возможна: let (|``R0..50``|_|) i = if i >= 0 && i <= 50 then Some() else None match someValue with | ``R0..50`` -> ... | _ -> ...

Только что-то не работает

Roman
21.07.2017
21:14:54
У меня вопрос к залу! type 'a heap = | Empty | Node of int*'a* 'a heap * 'a heap * 'a heap module Heap = let priority = function | Empty -> failwith "empty" | Node(p,v,parent,left,right) -> p let value = function | Empty -> failwith "empty" | Node(p,v,parent,left,right) -> vМожно ли написать какую-то оберточную функцию, чтоб она принимала другую функцию, обрабатывающую только кейс Node(...)? Иными словами, можно ли как-то ограничить тип аргумента одной частью юниона? Ну или другой подход подскажете, чтоб не писать каждый раз | Empty -> failwith "empty"?

Evgeniy
22.07.2017
04:59:03
У меня вопрос к залу! type 'a heap = | Empty | Node of int*'a* 'a heap * 'a heap * 'a heap module Heap = let priority = function | Empty -> failwith "empty" | Node(p,v,parent,left,right) -> p let value = function | Empty -> failwith "empty" | Node(p,v,parent,left,right) -> vМожно ли написать какую-то оберточную функцию, чтоб она принимала другую функцию, обрабатывающую только кейс Node(...)? Иными словами, можно ли как-то ограничить тип аргумента одной частью юниона? Ну или другой подход подскажете, чтоб не писать каждый раз | Empty -> failwith "empty"?
Можно match-блок выделить в отдельную функцию: https://gist.github.com/gsomix/ee4325a18422eb51f33b2b010d3b90c7 Empty и Node — это значения типа Heap. В F# нельзя описать тип, на который наложено ограничение в стиле "только значение Node из Heap". Для этого понадобилась бы зависимая типизация, если я правильно понимаю. P.S. Мне не особо нравятся функции-геттеры, особенно бросающие исключения. ;)

Nikolay
22.07.2017
06:03:50
Даже лучше завести параметризуемый паттерн Range a b i.
Я попробовал, но он что-то тоже не сработал

Evgeniy
22.07.2017
06:12:54
Я попробовал, но он что-то тоже не сработал
Что значит "не сработал"? Джентльмены так не говорят, а показывают код и сообщения компилятора.

Nikolay
22.07.2017
07:35:50
Что значит "не сработал"? Джентльмены так не говорят, а показывают код и сообщения компилятора.
Вот такой код: let (|NumRange|_|) i max min = if i >= max && i <= min then Some() else None let getWeatherEmoji id = match id with | 800 -> "☀️" | 801 -> "?" | 802 -> "⛅️" | 803 -> "?" | 804 -> "?" | NumRange 600 622 -> "❄️" | NumRange 300 531 -> "?" | NumRange 200 232 -> "⛈" | _ -> ""

Ошибок нет

Просто не срабатывают числа в интервале, возвращает пустую строку

Evgeniy
22.07.2017
07:37:16
Паттерн неверно написан.

Сначала идут параметры.

Google
Nikolay
22.07.2017
07:37:57
max min i?

Да, спасибо)

Friedrich
22.07.2017
10:22:12
Господа, а кто-нибудь умеет работать с модулем NativePtr? У меня в переменной лежит указатель на структуру, а я хочу из неё получить указатель на поле этой структуры. В C# я бы сделал char* fieldPtr = &struct->field, а вот как в F# — не могу понять :( Оператор -> не работает на типе nativeptr<MyStruct>.

Nikolay
22.07.2017
10:26:36
Никто не сталкивался с проблемой в SqlProvider, когда он вместо int ставит uint?

На гитхабе есть свежая issue, но там как-то тихо

https://github.com/fsprojects/SQLProvider/issues/437

Adam
22.07.2017
11:09:05
Цитата из книги по F#. Не совсем понятно, что тут имеется в виду. «В языке C# существует возможность реализовать интерфейс лишь частично и предоставить производным классам недостающую реализацию. В языке F# такая возможность отсутствует. Если тип объявляет, что он реализует интерфейс, он должен реализовать все методы и свойства»

Имеется в виду, что в F# абстрактных классов нет чтоли? Я сомневаюсь, что в C# можно заимплементить интерфейс и предоставить не все реализации, если интерфейс не расширяет абстрактный класс

Friedrich
22.07.2017
11:13:48
Абстрактные классы есть.

Мне эта цитата тоже непонятна.

Adam
22.07.2017
11:14:52
Придётся в оригинале смотреть, непереведённый вариант

Вот этот момент ещё не совсем понятен, но скорее всего, мне нужно где-то про это почитать. «Операторы связывания let в действительности являются правилами сопоставления с образцом:» let x, y = (100, 200) // ... аналогична такой конструкции... match (100, 200) with | x, y -> ...

Igor
22.07.2017
11:20:27
Что за книга то?

Adam
22.07.2017
11:20:55
Что за книга то?
Программирование на F# - Oreily (русский перевод)

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