
Григорий
01.02.2018
11:48:33
баян, но все https://habrahabr.ru/post/183150/
монады ведь можно использовать или не подходит?

Aleksey
01.02.2018
11:49:43
монады то тут причем? :)
В общем случае будет не Some/None, а что-то другое

Google

Klei
01.02.2018
11:51:21

Денис
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

Fill
01.02.2018
12:13:01
всем добрый день, вопрос такой:
если мэтчим, например, простой инт, то можем перечислять несколько вариантов таким образом:
match x with | 1 | 3 | 8 -> "good" | _ -> "bad"
если же мэтчим опциональный тип с каким-то условием, было бы классно писать что-то типа
match option with | None | Some when <...> -> "good" | _ -> "bad", но компилироваться это не хочет, приходится писать
match option with | None -> "good"| Some when <...> -> "good" | _ -> "bad", т.е. если вместо "good" будет что-то достаточно большое, придётся либо копипастить, либо выносить в функцию (но кода всё равно становится больше, его модификация требует лезть уже как минимум в два места)
можно ли как-то это обойти штатными методами?
match x with Option.None | Option.Some _ when true ->"good" | _-> "bad"
нет?

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

Evgeniy
01.02.2018
12:35:19
@shishkinpavel А что у тебя за задача?
Может для этой ситуации стоит завести отдельный тип?

Григорий
01.02.2018
12:59:23
то есть всего три ветки
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 выполняется и когда нет
@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
Столкнулся тут с проблемой - вот сделал я проект на F#. В IDE у меня есть код ленс, вывод типов и т.д. Но в веб-интерфейсе репозитория всего этого нет, в итоге человек, который делает ревью обречён на страдания. Отсюда вопрос, что тут можно сделать? Идея вручную аннотировать всё что можно - ну такое. Мне пришло в голову только написать тулзу, которая добавляет сигнатуру функции в комментарий к ней, но то же не очень. Как быть?
Ну, мне доводится делать ревью F#-кода на GitHub, и каких-то особенных трудностей я (обычно) не испытываю. Есть соображение (не подтверждённое), что, если код не читается без IDE'шных аннотаций, то, возможно, с ним что-то не так, и его стоит доработать.
Ну и для массивов тогда будет более оптимальный код, да.


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 не нужно

Siarhei
01.02.2018
16:08:44

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

Bonart
02.02.2018
06:17:57

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

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#?

Pavel
02.02.2018
12:07:36

A64m
02.02.2018
12:18:42

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 можно почитать