
Roman
05.06.2017
19:33:00

Aleksander
05.06.2017
19:33:10

Roman
05.06.2017
19:33:21

Evgeniy
05.06.2017
19:35:12
@Dolfik Суть в том, что компилятор не может правильно выбрать интерфейс, который будет использоваться для перечисления JObject.
(jObject :> seq<KeyValuePair<string, JToken>>) |> Seq.iter (fun f -> printf "%s" (f.Key))
Заведи себе функцию.
let toSeq d = d |> Seq.map (fun (KeyValue(k,v)) -> (k,v))

Google

Aleksander
05.06.2017
19:35:37
но вообще похоже на баг

Evgeniy
05.06.2017
19:39:13
Он не сбоит, просто выводит ближайший тип.

Aleksander
05.06.2017
19:40:07
ну после прямой подсказки (fun (f:KeyValuePair<string,JToken>) данных уже хватает чтобы взять нужный?
+ вопрос - почему выводит по-разному в seq и for?

Evgeniy
05.06.2017
19:40:49
Я не уверен. В Seq функциях цепочка вызовов с получением одного IEnumerable и оборачиванием в другой.
Надо смотреть конкретно, что там происходит.
@akhanteev Почему выводит по-разному, конечно, хороший вопрос. :)
Dev Привет!

Dev
05.06.2017
19:48:43
прив! я пока присмотреться, прислушаться.. может когда чего спросить
f# только начал грызть

Evgeniy
05.06.2017
19:57:14
@akhanteev Логично предположить, что for просто вызывает GetEnumerator у JObject.
А при вызове, например, Seq.iter наш JObject уже интерпретируется как seq<'T>, который выводится как ближайший seq<JToken>.

Google

Evgeniy
05.06.2017
20:00:43
И уже для этого типа получают перечисление.
Вывод типов не справляется без явной подсказки. Ситуация же неоднозначная, то ли функция имеет неправильный тип, то ли перечисление не то выбрали. Не думаю, что это баг. Просто особенность.
@akhanteev @Dolfik ^
Занятно, но если не использовать пайп, то уже тип функции будет определять тип перечисления.
Seq.iter (fun (f:KeyValuePair<string, JToken>) -> printf "%s" (f.Key)) jObject

Nikolay
05.06.2017
20:28:25
Наговнокодил сериализатор DU :D
Боюсь код заливать в гит теперь

Aleksander
05.06.2017
20:37:06
@gsomix GetEnumerator кстати выдает kvp: printfn "%A" (jObject.GetEnumerator().Current.GetType().Name)

Evgeniy
05.06.2017
20:38:09
@akhanteev Все верно.
И у него есть ещё один, от JContainer, который реализует IList<JToken>.
@Dolfik А for внутри seq это отдельная история. :)

Nikolay
05.06.2017
20:47:24
Всего тестов: 7. Пройдено: 7. Не пройдено: 0. Пропущено: 0.
ммм
Зацените конвертер: https://github.com/Dolfik1/Funogram/blob/master/Funogram/JsonConverters.fs
Который type DuConverter() =

Klei
05.06.2017
20:58:22

Aleksander
05.06.2017
20:59:39
ну, кажется с seq / for ситуация прояснилась.. внутри seq.fs все работает на кастах к IEnumerable / IEnumerator, а в JToken они эксплицитно реализованы
let jObject = JObject(JProperty("1","test"))
for k in (upcast jObject : IEnumerable<_>) do
printf "%s" (k.GetType().Name)
for k in jObject do
printf "%s" (k.GetType().Name)

Evgeniy
06.06.2017
05:09:36
@akhanteev Да, это так.
Кстати, за этими разговорами о множественной реализации IEnumerable<'T>, я вспомнил про вот такой RFC.
https://github.com/fsharp/fslang-design/blob/master/RFCs/FS-1031-Allow%20implementing%20the%20same%20interface%20at%20different%20generic%20instantiations%20in%20the%20same%20type.md
> Natallia Dzenisenka - Parallel Programming with F# and Hopac

Google

Evgeniy
06.06.2017
07:17:06
Надо не забыть потом это видео с dotnetfringe посмотреть. :)

Artemy
06.06.2017
09:19:23

Friedrich
06.06.2017
09:27:58
Я думаю, это вышло по недосмотру. Просто никому в голову не пришло, что это придётся отдельно обрабатывать :)

Artemy
06.06.2017
09:29:03
В сообщении об ошибке, кстати, пишет, что "не поддерживается в текущей версии F#"

Aleksander
06.06.2017
09:34:51
у меня вчера что-то похожее вроде работало локально (на F# 4.1), и не работало в dotnetfiddle (там, похоже F# 4)

Friedrich
06.06.2017
09:35:18
Пожалуйся им, пускай обновляют.

Evgeniy
06.06.2017
09:35:44
Artemy Есть ещё одна штука, которая не поддерживается.
https://stackoverflow.com/questions/3857474/how-to-constrain-one-type-parameter-by-another

Artemy
06.06.2017
09:36:03

Aleksander
06.06.2017
09:36:35
да много где еще, похоже, F# 4.. в Azure Functions, например. причем по крайней мере в локальные тулы он зашит намертво

Artemy
06.06.2017
09:37:02
Просто у меня F# 4.1. И не компилится.

Aleksander
06.06.2017
09:37:15
вечером посмотрю)

Evgeniy
06.06.2017
09:37:45
Так RFC ещё не реализовали.

Artemy
06.06.2017
09:38:07
Ну так да

Aleksander
06.06.2017
09:43:02
Просто у меня F# 4.1. И не компилится.
Возможно, я пробовал немного по-другому:
open System.Collections
open System.Collections.Generic
type T () =
interface IEnumerable with
member x.GetEnumerator () : IEnumerator = failwith "not impl"
interface IEnumerable<string> with
member x.GetEnumerator () : IEnumerator<string> = failwith "not impl"
type T' () =
inherit T ()
interface IEnumerable<int> with
member x.GetEnumerator () : IEnumerator<int> = failwith "not impl"
вот такая штука в dotnetfiddle не работает тоже

Friedrich
06.06.2017
09:45:08
Это не совсем то, но интерес тоже представляет.

Evgeniy
06.06.2017
09:45:31
> The existing workaround is to add one extra hierarchy level per generic instantiation.
Ну, да.

Google

Anton
06.06.2017
10:41:55
читаю я тут статейку и у меня вопрос, а что у нас является аналогом хаскельского fmap ?
https://habrahabr.ru/post/183150/

Vasily
06.06.2017
10:42:16
flatMap в смысле?

Anton
06.06.2017
10:43:12
нууу, я не знаю, я по этому и спрашиваю =)

Artemy
06.06.2017
10:43:27

Anton
06.06.2017
10:44:00
Хм, как тогда понимать статью относительно F#? 0_о

Artemy
06.06.2017
10:45:03
Ну в стандартной библиотеке F# нету функторов, аппликативных функторов и т.п. непосредственно как типов.
Так что эту статью следует понимать чисто как общие понятия, принятые в ФП.

Anton
06.06.2017
10:46:52
черт - сложно.

Artemy
06.06.2017
10:46:56
Вовсе нет

Anton
06.06.2017
10:47:03
я хотел ручками потренироваться, мне так проще.
я пока руками не потрогаю - не понимаю.

Vasily
06.06.2017
10:48:03
Короче, в f# нету того, что называется HKT- Higher Kind Types, поэтому обощенный fmap нельзя написать

Artemy
06.06.2017
10:48:11
Просто та же функция map может делать что угодно гипотетически. Но все понимают, чего от неё ждать лишь потому ,что есть вот такое принятое понятие "функтор" с определённым оговорённым ожидаемым поведением.
Вообще, функтор в F# можно описать, как тут, например:
https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/generics/statically-resolved-type-parameters
Но это чисто в учебных целях. Навряд ли на практике это может быть полезно.

Anton
06.06.2017
10:50:17
хм

Friedrich
06.06.2017
10:51:16
fmap есть в FSharpPlus, смотрите: http://gusty.github.io/FSharpPlus/abstraction-functor.html
И вообще, если кто не знал (я не знал), FSharpControl теперь смержилось в FSharpPlus.

Artemy
06.06.2017
10:51:57
Ага
Один раз использовал FSharpPlus, чтобы использовать обобщённый оператор >>=.

Google

Friedrich
06.06.2017
10:52:56
http://gusty.github.io/FSharpPlus/abstractions.html — вот эта схемка любителям теорката придётся по душе.
@the_RAMZAY ↑↑

Anton
06.06.2017
10:53:41
@fvnever вижу =)
это типо войдёт в стандарт?

Friedrich
06.06.2017
10:53:54
Нет. Это просто библиотека.
(дальше личное мнение) Я считаю, что стандарт можно и не загружать этой теоретической хуергой.
Если это можно реализовать в качестве библиотеки — очень хорошо.

Artemy
06.06.2017
10:55:21
Самая годная реализация всех этих штук получится в Haskell
На F# это пока костыли, как я понимаю.

Friedrich
06.06.2017
10:56:22
Я, например, вообще сейчас вручную наворачиваю у себя в коде тайпклассы из C#-пропозала (разворачивая их в генерики со структурами), и горя не знаю :)

Artemy
06.06.2017
10:57:23
Ну то, как это сделано в FSharpPlus (а как именно - я пока не знаю), сделать как обучающий пример — довольно жестко.

Friedrich
06.06.2017
10:57:51
С этим согласен.

Roman
06.06.2017
10:59:08

Artemy
06.06.2017
10:59:21
А человек хочет функторы и т.п. саморучно реализовать, чтобы разобраться. Тут, честно говоря, без понятия, что посоветовать. У самого опыта почти нет.
Я в F# это даже и не пробовал описывать.

Anton
06.06.2017
11:05:22
Эх, вот не думал что столкнусь в подобными ограничениями языка.

Evgeniy
06.06.2017
11:06:18
@the_RAMZAY На практике с таким редко сталкиваются.

Anton
06.06.2017
11:06:40
Вполне возможно

Pawel
06.06.2017
11:41:21