@Fsharp_chat

Страница 89 из 772
Летучая
01.05.2017
21:40:09
оч красиво

Akhmed
01.05.2017
21:41:26
Да по закону Мура все что может случится случается. Вот этот пример всегда смущал что тот же Scott Wlaschin его приводит как крутую вещь в F# но везде и всегда показывает только с двумя значениями. А в реальной жизни далеко не два и даже не три значения приходится хранить как информацию о клиенте

Max
01.05.2017
21:41:44
let t = Seq.unfold (fun (u,v) -> Some(u,(u+v,u))) (1I,1I) let fibI = t |> Seq.filter(fun x->x.ToString().Length=4) |> Seq.head

Google
Max
01.05.2017
21:41:49
например)

Roman
01.05.2017
21:42:49
let t = Seq.unfold (fun (u,v) -> Some(u,(u+v,u))) (1I,1I) let fibI = t |> Seq.filter(fun x->x.ToString().Length=4) |> Seq.head
уточним задачу, нужно показать "лаконичный код" )

поэтмоу хоть код изначальный и гораздо лушче, но он не тот фибоначи который все знают с hello world'a )

Max
01.05.2017
21:51:12
поэтмоу хоть код изначальный и гораздо лушче, но он не тот фибоначи который все знают с hello world'a )
тогда не уверен что может быть что-то проще того, что ты первый раз кинул

Max
01.05.2017
21:52:18
это?
ну только без 0

Roman
01.05.2017
21:53:23
ну только без 0
точно вот что смущало, до 0 и не дойдет же.

Летучая
01.05.2017
21:54:07
но 0 могут подать на n

но можно | 0 | 1 ->

а, не) низя.

Arseniy
01.05.2017
21:57:19
да можно сделать на сиквенсах опять же

можно через анфолд

толку-то в этом? F# операции над Seq никак не оптимизирует. и привет новые енумераторы почем зря

Google
Arseniy
01.05.2017
21:59:57
можно через анфолд
а онфолд - это каждое значение обернуть в option, который класс. то есть на каждое число - объект-компаньон в мусоре

так себе однострочники)

Max
01.05.2017
22:00:50
Просили лаконичный код...

Arseniy
01.05.2017
22:01:37
да я просто к тому, что в F# упражнения на однострочниках большого прифита не несут.

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

Friedrich
02.05.2017
01:17:15
Akhmed
02.05.2017
01:32:19
А что за случай, когда обязательно вводить тип-произведение вида «каждый кейс с каждым»? Как на других языках это решается? Может быть, тут вообще нужно другое решение? Давайте обсудим :)
ну собственно именно об этом и был мой вопрос. Почему делается тип где перечислается выбор из трех значений где третий это комбинация двух первых?

Friedrich
02.05.2017
01:33:27
С тем, что пример немного искусственный, я согласен.

Akhmed
02.05.2017
01:33:35
в императивном стиле это было бы что то вроде модели предметной области который выбрасывал бы исключение в негативных сценариях

Friedrich
02.05.2017
01:34:03
В реальном коде такое можно встретить, но, пожалуй, не так уж и часто.

в императивном стиле это было бы что то вроде модели предметной области который выбрасывал бы исключение в негативных сценариях
А вот как контрпример решению на исключениях и проверках во время выполнения тот код обычно и приводят, да? Он не совсем жизненный, но идею демонстрирует нормально.

Akhmed
02.05.2017
01:36:08
да идею то я понял - но что если мне нужно теперь еще третье значение добавить?

как тогда разрулить это?

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

как вариант можно сделать какой нибудь Builder который собирает модель

и один метод Validate который проверяет что хотя бы одно значение задано

тогда в императивном стиле добавление новых полей никак не скажется на предыдущих значениях и не приведет к взрывообразному росту комбинаций возможных значений

вот небольщой трешак набросал в многословном императивном стиле:

public class BaseModel : Dictionary<string, object> { protected void SetValue<T>(string key, T value) { this[key] = value; } protected T GetValue<T>(string key) { if (this.ContainsKey(key)) { return (T)this[key]; } return default(T); } }

ну и собственно сама модель:

Google
Akhmed
02.05.2017
01:48:11
public class ContactModel : BaseModel { public string Email { get { return GetValue<string>("email"); } set { SetValue("email", value); } } public string Phone { get { return GetValue<string>("phone"); } set { SetValue("phone",value);} } public bool Validate()=>this.Any(); }

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

конечно многословно но можно AOP либу (Fody) замутить для того что бы намного меньше слов было и осталось что то вроде Email {get; set;}

ну это если совсем заморочится

Roman
02.05.2017
04:49:37
Pavel
02.05.2017
05:18:57
type CaseOfDu = { Id: string; Phone: string } type Du = CaseOfDu of CaseOfDu

Это если в "строчке" больше двух трёх-значений появляется.

Evgeniy
02.05.2017
05:46:02
@SherievAkhmed Задача в том, чтобы избежать полностью незаполненный ContactInfo?

Nikolay
02.05.2017
05:52:15
А кто мне пример скидывал из Suave?

С конфигом)

Evgeniy
02.05.2017
05:53:29
@SherievAkhmed @fvnever Кажется, есть у меня решение этой задачи. Доберусь до работы -- проверю.

Nikolay
02.05.2017
05:53:39
https://github.com/SuaveIO/suave/blob/f0831e3ed00c611f78a04ac30d3a065403470274/src/Suave/Web.fs#L69 вот как suaveio работает с кучей значений. и вот как это выглядит в коде startWebServer defaultConfig (Successful.OK "Hello World!")

Nikolay
02.05.2017
05:55:37
Не, что-то не то)

Pavel
02.05.2017
06:00:26
Про defaultConfig у меня дежа-вю, мы обсуждали же это неделю что ли назад.

Friedrich
02.05.2017
06:07:28
Вчера же было!

Nikolay
02.05.2017
06:39:05
Не могли блин нормальные опциональные аргументы завезти

Igor
02.05.2017
06:50:22
Не могли блин нормальные опциональные аргументы завезти
А не думал вообще замутить билдеры на своем DSL?

Nikolay
02.05.2017
06:54:07
Igor
02.05.2017
06:54:37
И как это должно выглядеть?
приведи пример запроса

Google
Nikolay
02.05.2017
06:55:24
Telegram.getUpdates offset limit timeout msgFilter

Все параметры опциональные

Evgeniy
02.05.2017
06:58:56
@SherievAkhmed @fvnever Добрался до работы. Мне пришло одно "почти" решение в голову. Вместо комбинирования различных кейсов в DU, мы можем использовать non-empty list. Это избавит нас от невалидного пустого состояния.

Почему это "почти" решение? Потому что в списке может информация дублироваться.

Friedrich
02.05.2017
06:59:52
Не могли блин нормальные опциональные аргументы завезти
С опциональными аргументами в языке с каррированием всё очень сложно. И поэтому они есть, но только в местах, в которых каррирование запрещено: в объявлениях методов и конструкторов. См. https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/parameters-and-arguments#optional-parameters

Evgeniy
02.05.2017
07:04:43
@fvnever Мы хотим make illegal state unrepresentable, как обычно.

Friedrich
02.05.2017
07:05:50
А какое состояние там нелегальное?

Admin
ERROR: S client not available

Friedrich
02.05.2017
07:05:55
Вроде бы любое легальное, не?

Evgeniy
02.05.2017
07:06:01
В оригинальном примере illegal state -- это отсутствие email и post.

Friedrich
02.05.2017
07:06:04
Или одно задано, или другое, или оба.

А, ок.

Да, хорошо.

Evgeniy
02.05.2017
07:06:15
Можно придумать пример побольше.

Пусть у нас система оповещает пользователя в соцсетях.

Их может быть много.

В DU не скомбинируешь все варианты.

Google
Evgeniy
02.05.2017
07:17:47
@fvnever https://hastebin.com/cutepifota.fs

Синтаксически выглядит не очень красиво.

Friedrich
02.05.2017
07:17:59
cutepifota

Мне нравятся URL на хастебине :)

Синтаксически выглядит не очень красиво.
И в рантайме будет очень тормозить :(

Evgeniy
02.05.2017
07:19:25
Прям очень-очень? :)

Friedrich
02.05.2017
07:19:42
Ну, как связный список.

Evgeniy
02.05.2017
07:20:25
Можно побыстрее написать.

Не суть же.

:(

Friedrich
02.05.2017
07:20:59
Согласен, да, можно сделать чтоб не тормозило. Обмазать всё через struct и массив вместо списка жахнуть.

Evgeniy
02.05.2017
07:21:21
Я думаю, как это синтаксически менее мерзко сделать.

Обязательно нужно active patterns навернуть, чтобы из Accounts нужную информацию вытаскивать.

@fvnever А еще можно не париться. :)

Friedrich
02.05.2017
07:26:25
Преждевременная деоптимизация — это очень вредно.

Так же вредно, как и преждевременная оптимизация.

Evgeniy
02.05.2017
07:27:01
@fvnever Я про задачу в общем.

Хорошо бы всегда неправильное состояние делать непредставимым.

Но еще бы читабельность сохранить при этом.

@fvnever Поэтому пример с Email и Post можно всем показывать и радоваться, а вот то, что я сочинил лучше закопать.

Как мне кажется.

@fvnever @SherievAkhmed Вечером сделаю полноценный пример.

Nikolay
02.05.2017
07:55:09
http://fsharplang.ru до сих пор не работает

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