@Fsharp_chat

Страница 309 из 772
Astmatik
13.09.2017
15:31:13
я предполагал, что type matching распространяется на этот случай

ну да, полиморфно

в C# такое сработало бы через интерфейс

Evgeniy
13.09.2017
15:33:57
в C# такое сработало бы через интерфейс
И здесь сработает, если интерфейс будет.

Google
Klei
13.09.2017
15:35:23
в C# такое сработало бы через интерфейс
Есть инлайн, но на текущем уровне понимания лучше этого не делать.

Летучая
13.09.2017
15:36:02
в C# такое сработало бы через интерфейс
конструкция type A() = interface ISome with (* implement here *)

Есть инлайн, но на текущем уровне понимания лучше этого не делать.
А можешь подробнее рассказать (или ссылку на статью/доки кинуть)?

Klei
13.09.2017
15:39:49
А можешь подробнее рассказать (или ссылку на статью/доки кинуть)?
Member constraint. https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/generics/constraints

Vasily
13.09.2017
15:40:16
member constraints вообще позволяют прикольный duck typing

Klei
13.09.2017
15:41:55
Хотя относится ли это к инлайну, не уверен. Мне надо разграничить термины.

Evgeniy
13.09.2017
15:47:06
Vasily
13.09.2017
15:47:42
Придется, но можно отказаться от концепции интерфейсов

Летучая
13.09.2017
15:48:39
А, понятно. Та самая прекрасная type Sample<'T when 'T : (member A : int)> =!

Vasily
13.09.2017
15:48:57
Угу

Летучая
13.09.2017
15:49:09
Очень круто, и интерфейсы не угнетают.

Klei
13.09.2017
15:50:06
Если выделить гетер id в отдельный метод, то в принципе будет серьёзная экономия. Главное не злоупотреблять.

Снежный
13.09.2017
16:00:53
Привет. Продолжаю изыскания по F#. Такой вопрос: Как объявить поле в классе, типа интерфейс? но без создания объекта?

Google
Снежный
13.09.2017
16:00:59
type IServiceCallback= [<OperationContract(IsOneWay = true)>] abstract member OnServiceEvent: svcPacket : SvcPacket -> unit type ServiceCallback() = interface IServiceCallback with member this.OnServiceEvent(svcPacket)= Console.WriteLine("packet") () type Service() = let mutable _callback: IServiceCallback = ; let doSomething() = _callback <- new ServiceCallback() ()

let mutable _callback: IServiceCallback = ; проблема тут

причем, если интерфейс объявить как public interface IServiceCallback { [OperationContract(IsOneWay = true)] void OnServiceEvent(SvcPacket svcPacket); } то всё прекрасно работает

let mutable _callback: IServiceCallback = null;

Vasily
13.09.2017
16:04:39
Не стоит пытаться программировать на f# в оо стиле

Снежный
13.09.2017
16:12:46
понимаю, но хочется WCF реализовать полностью на F#

Klei
13.09.2017
16:15:50
let mutable _callback: IServiceCallback = ; проблема тут
Я не понял, в чем проблема. Через val не пробовал? https://msdn.microsoft.com/ru-ru/library/dd469494(v=vs.110).aspx

Vasily
13.09.2017
16:15:55
Особого профита не будет

Будет эдакий c# код в синтаксисе f#

Летучая
13.09.2017
16:17:16
member x.OnServiceEvent (packet: SvcPacket) =

вроде так, если ничо не путаю

Vasily
13.09.2017
16:18:15
Только что синтаксис немного выучишь

Снежный
13.09.2017
16:18:47
в методе doSomething, не находит проперти

Летучая
13.09.2017
16:19:07
Только что синтаксис немного выучишь
Ну, в некоторых случаях это может быть вынужденной необходимостью. Например, использовать C# фреймворки из F# кода (хотя для большинства случаев есть аналоги)

Vasily
13.09.2017
16:19:23
Опять же, неясно,как DataContractSerializer обходится,с опшнами,например

Подозреваю,что никак

Снежный
13.09.2017
16:19:38
понимаю, просто не хочется венигрет делать из моделей F# и C#

Летучая
13.09.2017
16:20:30
в методе doSomething, не находит проперти
Сделай вот что: type Service() as x = do x.SomeProperty = "Hi world"

Vasily
13.09.2017
16:20:34
А ты сделай провайдера с обвязкой на c#,а на f# всю доменную логику

Google
Снежный
13.09.2017
16:21:28
Klei
13.09.2017
16:21:48
Будет эдакий c# код в синтаксисе f#
Мне один необращенный жаловался, что f#исты мешают переходу постоянно критикуя за ооп артефакты. Мол дали бы перенести любимые игрушки, давно бы среди нас был. Так что лучше решить проблему без претензий к осмысленности.

Летучая
13.09.2017
16:21:50
А ты сделай провайдера с обвязкой на c#,а на f# всю доменную логику
Но зачем? F# умеет всё, что умеет C#. Ну, кроме всяких сахарных штуковин, типа [<ParamArray>] (словил сегодня бугурт из-за него. Параметры чёрти как передавались, а Ionide не ругался. Пришлось указывать имена параметров явно и пихать в них массивы.)

Снежный
13.09.2017
16:22:01
А ты сделай провайдера с обвязкой на c#,а на f# всю доменную логику
Так и было сделано, просто не спортивно как-то

Vasily
13.09.2017
16:22:28
Зато практично

Сейчас скорее всего получится какая-нить странная кодовая база,в которую будет тяжело вносить изменения

Снежный
13.09.2017
16:57:48
Крутяк, работает. Получилось избавится от C# моделей.

да, кстати к интерфейсу надо ещё аттрибут приписать [<AllowNullLiteral>], может кому-нибуть поможет :)

Летучая
13.09.2017
17:02:36
в F# _очень_ не любят null и связанные с ним Exception (да и Exception вообще)

Снежный
13.09.2017
17:03:58
ну, в данном случае даже не знаю как обойтись без этого.

Летучая
13.09.2017
17:04:47
ну, в данном случае даже не знаю как обойтись без этого.
А зачем тебе NullLiteral? Какой-то библиотеке скармливаешь или null присваиваешь?

Снежный
13.09.2017
17:05:01
null присваиваю

переписывал C# код

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)] public class_UrlCheckerService : IUrlCheckerService, IHandle<JobArgs> { private IServiceCallback _callback; }

public bool Subscribe() { _callback = OperationContext.Current.GetCallbackChannel<IServiceCallback?);

и тд...

Astmatik
13.09.2017
20:10:04
А, понятно. Та самая прекрасная type Sample<'T when 'T : (member A : int)> =!
В итоге получилось иначе: type SomethingWithId = { mutable Id: string } let inline storeSomething (session: IDocumentSession) (something : ^a) = let something' = (^a: (member Id: string) (something)) session.Store(something) session.SaveChanges() something'

но я не понимаю этот дикий синтаксис )

let something' = (^a: (member Id: string) (something))

Google
Летучая
13.09.2017
20:24:01
В итоге получилось иначе: type SomethingWithId = { mutable Id: string } let inline storeSomething (session: IDocumentSession) (something : ^a) = let something' = (^a: (member Id: string) (something)) session.Store(something) session.SaveChanges() something'
let storeSomething<'a when 'a: (member Id: string)> (session: IDocumentSession) (something: 'a) = session.Store something session.SaveChanges() something.Id А вот так не пробовал?

Astmatik
13.09.2017
20:35:52
This code is not sufficiently generic. The type variable ^a when ^a : (member get_Id : ^a -> string) could not be generalized because it would escape its scope.

Летучая
13.09.2017
20:55:54


Если нужно просто получить id (и сделать функцию, принимающую объекты, у которых есть Id), достаточно такого: let inline log instance = let id = (^a: (member Id: int) instance) ()

Astmatik
13.09.2017
21:17:18
прикольно, получается, что ^a нигде не используется

больше похоже на шаблоны в C++, чем на дженерики

Friedrich
14.09.2017
04:21:44
понимаю, но хочется WCF реализовать полностью на F#
Если чо, я кой-чего полуэнтерпрайзное на WCF делал вот тут: https://github.com/ForNeVeR/Tracktor/tree/master/Tracktor.Service

У меня есть небольшой опыт броьбы с WCF-специфичными проблемами на F#; меня можно спрашивать.

больше похоже на шаблоны в C++, чем на дженерики
Ну да, это так и есть. Инлайн-функции работают ближе к плюсовым шаблонам.

Evgeniy
14.09.2017
05:03:37
больше похоже на шаблоны в C++, чем на дженерики
Для интереса можно посмотреть IL или декомпилировать в C#.

Evgeniy
14.09.2017
06:16:00
Хей?

Пожалуйте.

Sherzod
14.09.2017
06:20:09
Roman
14.09.2017
06:34:17
Не стоит пытаться программировать на f# в оо стиле
Стоит, но в скала подходе. ФП для малого ООП для большего

Evgeniy
14.09.2017
06:54:47
Мне нравится, как Сайм вместо ООП говорит "object programming". С акцентом на использование параметризуемых объектов и интерфейсов, но без создания больших иерархий.

Это идиоматичный способ организации кода в F#.

> Got something to share with the #FSharp community? Say it at #FSharpX 2018! А я еще не все видео с FSharpX 2017 посмотрел.

Google
Anton
14.09.2017
08:34:14
а можно как-то объявить массив флоатов/даблов не преписывая к каждому числу .0 ?

let array:float = [|1;2;3|] - типо вот так, и что бы оно само потом .0 поставило

Igor
14.09.2017
08:35:08
Можешь только . добавлять ?

Anton
14.09.2017
08:35:50
чот не удобная система

Igor
14.09.2017
08:37:04
Философия такая. Типы не надо писать - они выводятся, но никаких имплисит кастов.

Anton
14.09.2017
08:38:19
немного хочется тогда имплисита =)

Evgeniy
14.09.2017
08:39:53
немного хочется тогда имплисита =)
А потом ты захочешь implicit оператор из C#, и всё, нет больше @the_RAMZAY!

let array:float = [|1;2;3|] - типо вот так, и что бы оно само потом .0 поставило
Можно сделать явно, если лень приписывать точки. Экономия такая себе. let array = [|1;2;3|] |> Array.map float

Anton
14.09.2017
08:43:47
нууу, когда я копирую уже готовый массив данных на 64 элемента, мне достаточно муторно везде точки ставить.

Anton
14.09.2017
08:47:26
@gsomix смотри, у меня есть x и y векторы. Как мне их отрисовать в F# ?

это к той задаче по сжатию.

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