
Friedrich
21.07.2017
14:51:51

Vasily
21.07.2017
14:52:36
Опять же, смутило то, что нет внятной доменной модели
Все размазано по файлам ровным слоем

Oleg
21.07.2017
14:52:52

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
Таски в свою очередь могут выполнять наборы операций

Oleg
21.07.2017
14:55:18

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

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
Ок, свежий и опытный взгляд - это что нужно

Evgeniy
21.07.2017
16:42:34

Oleg
21.07.2017
16:43:21

Летучая
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"?


Nikolay
21.07.2017
21:15:32
У меня вопрос к залу!
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"?
Заверни код в '''


Oleg
22.07.2017
02:16:04
У меня вопрос к залу!
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"?
Написать
let value (Node(_,v,_,_,_)) = vНо тогда будет падать с исключением если 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

Evgeniy
22.07.2017
06:12:54

Nikolay
22.07.2017
07:35:50
Ошибок нет
Просто не срабатывают числа в интервале, возвращает пустую строку

Evgeniy
22.07.2017
07:37:16
Паттерн неверно написан.
Сначала идут параметры.

Google

Nikolay
22.07.2017
07:37:57
max min i?
Да, спасибо)

Roman
22.07.2017
08:58:23

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