@Fsharp_chat

Страница 465 из 772
Григорий
01.02.2018
11:48:33
баян, но все https://habrahabr.ru/post/183150/

монады ведь можно использовать или не подходит?

Aleksey
01.02.2018
11:49:43
монады то тут причем? :)

В общем случае будет не Some/None, а что-то другое

Google
Денис
01.02.2018
11:51:28
массив - монада

Pavel
01.02.2018
11:51:46
Klei
01.02.2018
11:53:10
это как? =\
let (|mypattern|_|) opt = ветка в some, ветка в none

Я с телефона.

Pavel
01.02.2018
11:55:06
спасибо!

let (|NoneOrCond|_|) condition option = match option with | None -> Some () | Some x -> if condition x then Some () else None let test cond t = match t with | NoneOrCond cond -> "good" | _ -> "bad" let a = [None; Some 3; Some 0] let cond x = x > 0 let res = a |> List.map (fun x -> test cond x)

вот так получается ["good"; "good"; "bad"]

теперь бы ещё понять почему так :D

Григорий
01.02.2018
12:03:05
а не проще через Option.filter ? Хотя дело хозяйское ))

Pavel
01.02.2018
12:08:44
Option.filter не будет же мэтчить None вариант

в смысле он будет отображать только Some с успешным предикатом в Some, а мне нужно, чтобы None и Some с успешным предикатом отображались в один вариант, а всё остальное — в другой

Vladimir
01.02.2018
12:12:15
можно перевернуть, если Some и предикат не выполняется, то bad, иначе good)

Google
Pavel
01.02.2018
12:14:06
при попытке проверять условие на основе значения, которое лежит в Some всё сломается

потому что появится новый биндинг

Evgeniy
01.02.2018
12:35:19
@shishkinpavel А что у тебя за задача?

Может для этой ситуации стоит завести отдельный тип?

Григорий
01.02.2018
12:59:23
при попытке проверять условие на основе значения, которое лежит в Some всё сломается
короче, там нужно добавить еще одну ветку в match - |Some y when ((cond y) = false) -> "=("Чтобы не крашилось

то есть всего три ветки match x with | Some y when ((cond y)) = true) -> "good" | Some y when ((cond y)) = false) -> "=(" | None -> "bad"

то есть если делать вот так, то выглядит проще: let xs = [Some 3; Some 2; Some 1; Some 0; None] let cond x = x > 2 let check x : string = match x with | Some y when ((cond y) = true) -> "good" | Some y when ((cond y) = false) -> "=(" | None -> "bad" let run = xs |> List.map checkval run : string list = ["good"; "=("; "=("; "=("; "bad"]

там просто не хватало веток когда условие в when выполняется и когда нет

вот это компилируется: let (|NoneOrCond|Other|) condition option = match option with | None -> NoneOrCond | Some x when condition x -> NoneOrCond | _ -> Other
let (|NoneOrCond|_|) condition option = match option with | None -> None | Some x when ((condition x) = true) -> Some () | Some x when ((condition x) = false) -> None let test cond t = match t with | NoneOrCond cond -> "good" | _ -> "bad" let a = [None; Some 3; Some 0] let cond x = x > 0 let res = a |> List.map (fun x -> test cond x)val res : string list = ["bad"; "good"; "bad"]

@shishkinpavel это точно компилируется =)

Vasily
01.02.2018
13:29:00
Хммм... таки получилось более-менее корректно написать билдер для HttpRequestMessage в функциональном стиле

Есть вопрос

Есть DU из набора функций

Есть список этих DU

Надо бы эти функции сгруппировать по типу

Т.е. по факту выполнить GroupBy

type RequestParameter= |Header of (unit->string*string) |Content of (unit->HttpContent) |Query of (unit->string*string) type RequestParameters=RequestParameters of RequestParameter list

Хотя в целом можно и три прохода

Google
Vasily
01.02.2018
13:34:01
Получается

Friedrich
01.02.2018
13:38:59
а были/есть какие-нибудь работы по оптимизации ренджей в генераторах массивов и форах? Чтоб это все в нормальные циклы компилялось, а не через инумераблы?
У меня есть идея каким-то образом автогенерализовать код, использующий IEnumerable<T>, в TCollection : IEnumerable<T>. Тогда он сможет нормально работать с энумераторами структурного типа, в частности. Если б LINQ сразу так сделали, то всё было бы намного лучше, я считаю.

Ну и для массивов тогда будет более оптимальный код, да.

A64m
01.02.2018
13:47:01
вообще-то многие методы в линк-ту-обджектс пытаются в рантайме скастить энумерабл к более богатому интерфейсу и использовать это, так же он еще и "фьюзить" пытается, т.е. подменить конвейер на один энумератор которым например мапает и фильтрует одновременно

но все равно это не особо хорошо работает

Bonart
01.02.2018
13:51:34
> Если б LINQ сразу так сделали, то всё было бы намного лучше, я считаю. А кто мешает взять и запилить на гитхабе?

A64m
01.02.2018
13:54:12
работать через интерфейс (c обычным объектом) на clr все равно дорого, вот работа через интерфейс как констрейнт с велью-типом очень хорошо оптимизируется, если бы в дотнетных языках не мучались со всем этим ООПом, а энкодили тайпклассы таким образом все бы работало намного лучше

Владислав
01.02.2018
14:34:53
Привет, а кто-нибудь решал задачу

https://adventofcode.com/2017/day/3

part 2 на F#? Как можно построить эту спираль без создания поля?

если я буду создавать массивы, а потом что-то туда писать это ж будет недекларативно

Kirill
01.02.2018
15:18:19
ребята, может кто сталкивался обновил .net core до 2.1.4 (последняя версия вроде) и теперь как-то странно работает dotnet new у меня есть кастомный шаблон freya и когда я пытаюсь написать dotnet new freya он мне вместо установки выводит хелп типа как здесь https://github.com/xyncro/freya-template#using-the-template причём если я пытаюсь тоже самое сделать со стандартным шаблоном навроде dotnet new sln всё работает

причём проблема не только с freya, с giraffe такая же ботва

Vladimir
01.02.2018
15:21:04
lang надо указывать (по крайней мере я недавно из-за этого подвисал)

Kirill
01.02.2018
15:23:50
ого, спасибо, ща попробую

о, сработало

Vladimir
01.02.2018
15:28:41
на здоровье

Pavel
01.02.2018
15:34:23
@shishkinpavel А что у тебя за задача?
задача в духе "хотим обновить значение по ключу, если сохранённое значение не больше", т.е. мапа {"foo", 1; "bar", 2} при добавлении {"baz", 10} добавит, при добавлении {"foo", 5} изменит значение, но при добавлении {"bar", 1} не изменит ничего

и мне кажется, я перемудрил

Google
Pavel
01.02.2018
15:36:36
let (key, value) = "foo", 1 match map |> Map.tryFind key with | Some x when x >= value -> map | _ -> map |> Map.add key value должно сработать, вроде

и никаких AP не нужно

Evgeniy
02.02.2018
04:55:31
Привет.

Bonart
02.02.2018
06:17:57
работать через интерфейс (c обычным объектом) на clr все равно дорого, вот работа через интерфейс как констрейнт с велью-типом очень хорошо оптимизируется, если бы в дотнетных языках не мучались со всем этим ООПом, а энкодили тайпклассы таким образом все бы работало намного лучше
Да, с интерфейсами JIT недорабатывает. Констрейнты, к сожалению, помогают не очень. Нельзя сделать две перегрузки метода, отличающиеся только констрейнтом. И в этом случае вся утиная типизация LINQ накрывается медным тазом. Но можно сделать свою библиотеку с оптимизацией именно работы со структурами через констрейнты.

Evgeniy
02.02.2018
08:16:41
Привет.

Dmitry
02.02.2018
08:17:12
День добрый!

Evgeniy
02.02.2018
08:20:33
У Симана новая серия статей? http://blog.ploeh.dk/2018/01/08/software-design-isomorphisms/

А, блин, это в рамках старой.

Vlad
02.02.2018
08:25:30
надо бы их все прочитать

Roman
02.02.2018
09:23:58
И перевести

Friedrich
02.02.2018
11:29:18
> Если б LINQ сразу так сделали, то всё было бы намного лучше, я считаю. А кто мешает взять и запилить на гитхабе?
По большому счёту, мешает обратная совместимость. Но я попробую, наверное. Спасибо за направление :)

Nikolay
02.02.2018
11:49:13
Мне показалось, или было сообщение фридриха

?

Friedrich
02.02.2018
11:49:22
(сорян, я нечаянно влез в совсем старые логи и пытался их комментировать, игнорируйте)

Хорошо, что вовремя опомнился :)

Nikolay
02.02.2018
11:49:56
?

Evgeniy
02.02.2018
11:54:49
@fvnever и так главный флудер здесь.

Fill
02.02.2018
12:00:13
норм практика просить ревью в чатике?

Google
Roman
02.02.2018
12:06:46
https://gist.github.com/vietnt/84c7532d70e83dee2545df7507158856 интересный пример Есть еще примеры работы с unsafe в F#?

A64m
02.02.2018
12:18:42
а где почитать про этот баг с итераторами на велью типе? что гуглить?
я с ходу не нашел тот пост где доказывается что вот так и надо делать, но описание и обьяснение странного поведения есть, например, тут https://codeblog.jonskeet.uk/2010/07/27/iterate-damn-you/

Pavel
02.02.2018
12:18:56
спасибо!

Evgeniy
02.02.2018
14:17:22
https://github.com/fscheck/FsCheck.Properties

.=.

Денис
02.02.2018
14:20:39
ктото одату заводил в netcore?

Vasily
02.02.2018
15:23:16
Мне кажется, завести ее будет тяжеловато

Денис
02.02.2018
15:25:43
Наверняка)) поэтому и спросил

Aleksander
02.02.2018
15:26:38
Она не на wcf разве завязана?

Денис
02.02.2018
15:34:10
Завязана

Vlad
02.02.2018
15:58:02
ктото одату заводил в netcore?
а вы про какую одату? просто есть RESTier (http://odata.github.io/) который от WCF не зависит. Но, судя по всему, с кором у них также грустновато. Но надежды есть, включая форк. Тут вот https://github.com/OData/RESTier/issues/540 можно почитать

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