
Летучая
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
поэтмоу хоть код изначальный и гораздо лушче, но он не тот фибоначи который все знают с hello world'a )

Max
01.05.2017
21:51:12

Roman
01.05.2017
21:51:39

Max
01.05.2017
21:52:18

Roman
01.05.2017
21:53:23

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

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

Nikolay
02.05.2017
07:01:05
Там же ломать нечего

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 до сих пор не работает