
Evgeniy
11.04.2018
12:14:23
Ты в Some получаешь ровно то, что туда заворачиваешь.
Грубо говоря, pattern matching работает в очень неожиданных местах. :)

??
11.04.2018
12:21:23

Evgeniy
11.04.2018
12:22:11

Google

??
11.04.2018
12:22:57

Evgeniy
11.04.2018
12:23:04
Ну, тогда хотя бы сделай аккуратно.
let inline (|Sample|_|) a = a = 0 |> f ()

??
11.04.2018
12:24:03

Evgeniy
11.04.2018
12:24:22

??
11.04.2018
12:24:47

Evgeniy
11.04.2018
12:25:28

??
11.04.2018
12:25:33
Просто делать через when не хочется совсем, а так аналог литералов.
Который, например, возвращает само значение.
Тут место, где обязана быть наглядность и такие шаблоны позволяют её соблюдать, еще раз спасибо. В нескоторых шаблонах доп логика типа проверок четностей и проч. Очень удобно, читабельно выглядит.

Pavel
11.04.2018
12:33:24

Evgeniy
11.04.2018
12:43:51

Vlad
11.04.2018
12:47:33

Evgeniy
11.04.2018
12:56:00

Google

??
11.04.2018
12:56:18

Friedrich
11.04.2018
13:04:49
В частности, у меня скомпилировалось такое:
let (|Sample1|_|) a =
printf "%A" (Sample1(Sample1("Unit")))
if a = 0 then Some a else None
WTF?
Вроде как сам по себе Sample1 имеет тип unit (сужу по декомпилированному коду), но при этом он ещё и является функцией, которая работает так же, как id.

Evgeniy
11.04.2018
13:09:43
?

Friedrich
11.04.2018
13:12:02
open System
let ptype<'a> (x: 'a) =
printfn "%A" (typeof<'a>)
[<EntryPoint>]
let main _ =
let (|Sample1|_|) a =
let foo = Sample1
let foo2 x = Sample1 x
// смотреть сюда
ptype Sample1 // Unit
ptype (Sample1 Sample1) // Unit
ptype foo // Unit
ptype foo2 // FSharpFunc`2[System.Object,System.Object]
printfn "%A" (Sample1 Sample1)
if a = 0 then Some a else None
match 10 with
| Sample1 a -> printfn "matched %A" a
| _ -> printfn "not matched"
0
Поразительно.
В декомпиле видно, что foo2 действительно работает как id.

??
11.04.2018
13:13:33

Friedrich
11.04.2018
13:14:00
Что матчилось? Я так и не понял, что же такое этот Sample1 внутри тела функции (|Sample1|_|).

??
11.04.2018
13:40:47
В смысле unit -> unit option

Evgeniy
11.04.2018
13:49:06

??
11.04.2018
13:59:03
^ @fvnever
> что же такое этот Sample1
С соседнего чата. Ну вот Sample1 выполняет функцию (то есть является функцией) распознавания значения. Внутри себя он не будет работать как распознаватель, если не сделать его рекурсивным:
let rec (|Sample1|_|) a =
match 10 with
| Sample1 a -> printfn "matched %A" a
| _ -> printfn "not matched"

Friedrich
11.04.2018
14:02:01
При том, что у меня никаких unit в этой функции нету.

Evgeniy
11.04.2018
14:08:25
https://twitter.com/gsomix/status/984069500789252096
Подождем. :)
С обычными активными шаблонами такой фокус не проходит.

Google

Vlad
11.04.2018
14:12:21

Evgeniy
11.04.2018
14:12:55

Friedrich
11.04.2018
14:13:52
а можно tldr происходящего?
Пока сами не поняли, что творится. Я по дефолту считаю, что это компиляторный баг (однако, я по дефолту неправ).

Vlad
11.04.2018
14:14:35

Evgeniy
11.04.2018
14:15:03

??
11.04.2018
14:24:26

Evgeniy
11.04.2018
14:24:51

??
11.04.2018
14:25:41

Evgeniy
11.04.2018
14:38:36
Шаблоны передавать можно, это просто функции же.

??
11.04.2018
14:43:13
Мне пока рано смотреть на плохое исполнение, потому и лезу сюда в поисках истины.

Evgeniy
11.04.2018
14:49:04
https://zaid-ajaj.github.io/Fable.React.Flatpickr/
https://twitter.com/zaid_ajaj/status/984024388084404225

??
11.04.2018
14:51:48
Я пока не хочу придумывать пример, где нужно через шаблон возращать шаблон, кроме обработки голов списка таким образом.

Klei
11.04.2018
14:54:16

??
11.04.2018
14:59:08

Klei
11.04.2018
15:05:28
Но судя по всему я не понял, что имелось ввиду в https://t.me/Fsharp_chat/54854.

Evgeniy
11.04.2018
15:46:21
Привет.

Google

Evgeniy
11.04.2018
16:58:53
https://twitter.com/pezi_pink/status/984100809981026304
Сложно

Friedrich
11.04.2018
17:00:13
Хм, то есть он полагает, что тут смешались частичные и полные шаблоны?

Evgeniy
11.04.2018
17:14:45
> cartermp [8:42 PM]
> I’m now writing an F# coding idioms/best practices article in our docs based on long conversations with Eirik
Воу!

??
11.04.2018
19:27:33
https://blogs.msdn.microsoft.com/dotnet/2018/04/11/announcing-net-core-2-1-preview-2/

Roman
11.04.2018
19:29:59

??
11.04.2018
19:30:26
А вот тут будет кто из участников чата? http://fsharpconf.com/

Evgeniy
11.04.2018
19:33:39
Привет.

Денис
12.04.2018
10:40:33
А есть для FSI какой нибудь способ досрочно прервать выполнение скрипта? Типа return или Environment.Exit()

Roman
12.04.2018
10:43:42

Alexey
12.04.2018
10:43:45
В vs : ctrl+break
Через контекстное меню тоже доступно

Evgeniy
12.04.2018
10:44:27
https://github.com/fsharp/fslang-suggestions/issues/567

Igor
12.04.2018
10:45:11
потому что компилятор начинает считать, что 'T - int

Roman
12.04.2018
10:45:23

Igor
12.04.2018
10:45:54
может лучше пользоваться obj -> int

Roman
12.04.2018
10:46:03

Google

Igor
12.04.2018
10:48:10
так она же и играет злую шутку из-за этого))

Roman
12.04.2018
10:48:20
Там не в типизации проблема
там явно указан тип 'T
И на него можно повесить констреийнты и все такое
но кмпилятор брет первое ипользовние и говорит, что теперь 'T это инт и больше никак. Хотя ф-ция готова принять и строку
и вот это не оч

Vasily
12.04.2018
10:51:52

Evgeniy
12.04.2018
10:52:29
@neftedollar Я же тебе скинул ссылку. Там описано, как это сделать, и почему это не реализовано.

Vasily
12.04.2018
10:52:36
Поэтому компилятор подставит первый выведенный
Инлайны решают часть проблем

Roman
12.04.2018
10:53:08