@Fsharp_chat

Страница 760 из 772
Александр
18.10.2018
00:21:50
Это значит, что после компиляции фшарпа мы по сути получаем ооп код)

Grigoriy
18.10.2018
00:21:51
Ребзя, ну хоть целиком сообщение читайте!

Я не про класс, а про сигнатуру метода!

Александр
18.10.2018
00:23:40
А я не на этот вопрос ответил, просто поддержал тему про естественность ооп в фшарпе

Google
Александр
18.10.2018
00:24:05
Когда-то это ломало мозг

Ведь по сути вся это функциональность под капотом объектно-ориентированная

Grigoriy
18.10.2018
00:31:21
Всё машинные коды

По сути

Электроны в пнп переходах

Александр
18.10.2018
03:01:02
Ну тоже верно

Friedrich
18.10.2018
05:27:19
Вот да. Подскажите, как правильнее отучить себя мыслить ООП и перестроить мышление в сторону ФП? ?
А я вот не считаю, что нужно «отучить» и «перестроить». Нужно изучать вторую парадигму и учиться сочетать в тех случаях, когда это уместно.

а когда пытаюсь вызвать x.abc(Some "1") - пися. Хочет либо x.abc("1"), либо x.abc()
Ну да, так и работает интероп, это нормально. Дело в том, что это опциональное значение подставляется во время компиляции (и там ещё есть дополнительная веселуха с виртуальными методами и интерфейсами — чуть менее весёлая в F#, но чуть более весёлая в C#).

Ну макось, линуха - одно семейство unix-like ? И как под маком? И какая IDE/редактор? VS Code?
Я, например, пишу на F# под Win, Linux, Mac, и везде юзаю Rider (дисклеймер — я один из его разработчиков). И всем советую ?

+ не забываем, что и система типов .NET, и CIL оба объектно-ориентированные
Нууу, строго говоря, в CIL можно писать, не используя классов. Даже методы можно размещать вне типов (C++/CLI этим активно пользуется, остальные — нет). Но их становится сложновато вызывать из C# (из F# я пока не пробовал).

Friedrich
18.10.2018
05:35:07
Ну, что-то подобное я и предполагал. Но тогда надо перед вызовом матч вкрячивать. Сразу string option не передать :(
Можно было бы это свалить на компилятор, но я боюсь, что какие-нибудь корнер кейсы начнут торчать слишком уж сильно.

Ну, типа, чтобы компилятор, увидев Option, который передают в метод со значениями по умолчанию, городил там конструкцию а-ля MethodCall(match o with | Some x -> x | None -> implicit_default_value)

Google
Friedrich
18.10.2018
05:36:36
Если кому шибко охота — давайте поищем или напишем пропозал.

Я просто не припомню, чтобы мне часто приходилось использовать такие конструкции, но, может, у других людей другой опыт.

Grigoriy
18.10.2018
05:42:16
Пропооозалы. Я тут всё собираюсь пр на сейф темплейт. То, что там сейчас оно, конечно компилится как-то, но если попытаться, что-нить сложнее инта погонять между клиентом и сервером - кмк всё сломается. Просто я по этим граблям уже недели две назад ходил...

А ты - пропозалы в компилятор

Напиши им - раз компилер сервис говорит стринг опшонал - извольте принять!

Friedrich
18.10.2018
06:01:04
Фантомасом пользуешься?
Я сам и есть Фантомас!

Roman
18.10.2018
06:01:50
Я сам и есть Фантомас!
https://github.com/fsprojects/fantomas Я про это)

Ayrat
18.10.2018
06:01:53
Мы как раз во флудилке обсуждаем фантомас

и что он в райдер оказывается встроен

Friedrich
18.10.2018
06:02:00
Ayrat
18.10.2018
06:02:14
А я вот не замечал что автоформат есть в райдере

Roman
18.10.2018
06:03:55
Я понял.
Ты даже в readme.md немного поконтрибутил) ?

Friedrich
18.10.2018
06:05:54
@grishace @gsomix говорит, что ты всё делаешь неправильно.

И я тоже неправ.

Смотри: твои default-аргументы из C# будет передавать очень неудобно

Потому что для C# твои ?opt: string будут выглядеть как Option<string>

Зато я немного пошукал в багтрекере и понял, как делать настоящие дефолтные аргументы так, чтобы C# их понимал.

Ayrat
18.10.2018
06:07:21
О, кстати, а есть возможность их сделать нормальными? Мне тоже надо немного надо

Google
Friedrich
18.10.2018
06:07:30
Встречайте моё безумное творение: open System.Runtime.InteropServices type C() = member this.M([<Optional;DefaultParameterValue(0)>] i : int) = ()

Grigoriy
18.10.2018
06:07:36
Так почему они для самого ф# не такие!?

Ayrat
18.10.2018
06:07:42
эх.

Так почему они для самого ф# не такие!?
Они для самого F# очень удобные!

не надо тут

Там же больше возможностей

Friedrich
18.10.2018
06:08:37
Они для самого F# очень удобные!
(не очень, как оказалось, т.к. настоящий опшен в них передать не получается)

Ayrat
18.10.2018
06:08:39
можно как передавать T, который будет оборачиваться в Option<T>, так и Option<T> который НЕ БУДЕТ оборачиваться в ещё один Option!

Grigoriy
18.10.2018
06:08:40
Почему я сразу стринг опшонал не могу передать?

Ayrat
18.10.2018
06:08:52
передавай через ?

Grigoriy
18.10.2018
06:09:17
Ayrat
18.10.2018
06:09:24
ща накидаю

Grigoriy
18.10.2018
06:10:19
Через тернарный оператор? :)))))

Ayrat
18.10.2018
06:10:42
это не очень известная фича, но полезно читать спеку

можно в ВЫЗОВ метода аргументы с префиксным ? передавать

Grigoriy
18.10.2018
06:11:12
Когда? Надо говнокодить!

Ayrat
18.10.2018
06:11:24
чтобы явно указывать что для этого опшнал аргумента заворачивать твой опшн в ещё один опшн не надо

магия!

Google
Grigoriy
18.10.2018
06:12:02
Сигнатура про второй опшонал молчит как рыба об лёд

Откуда обёртка?

Friedrich
18.10.2018
06:12:32
Это ж не сигнатура, а синтаксис такой.

Grigoriy
18.10.2018
06:12:46
Ооооокееейййй

Friedrich
18.10.2018
06:13:24
Айрат, у меня не получается вызвать со знаком вопроса: https://sharplab.io/#v2:DYLgZgzgPg9gDgUwHYAIDKBPCAXBBbAWACh5l0tc8A6AJQFclsBLPBKgSUYQCd40eAbkwDGCCMWLYMiFAGEAFAEoUAXmIoNKVngBGPFNgAWTCFQCy8gPxMUIFE0bKVKJes3a93A8dMAxJapumijACNgoAB6q6DCsKACMAAxBmkYm5lYRisRAA===

Grigoriy
18.10.2018
06:16:24
let g = Some x :))) @gsomix

Ayrat
18.10.2018
06:16:50
Айрат, у меня не получается вызвать со знаком вопроса: https://sharplab.io/#v2:DYLgZgzgPg9gDgUwHYAIDKBPCAXBBbAWACh5l0tc8A6AJQFclsBLPBKgSUYQCd40eAbkwDGCCMWLYMiFAGEAFAEoUAXmIoNKVngBGPFNgAWTCFQCy8gPxMUIFE0bKVKJes3a93A8dMAxJapumijACNgoAB6q6DCsKACMAAxBmkYm5lYRisRAA===
type Test() = member __.Opt(a,?b)= printfn "%A, %A" a b let t = Test() t.Opt(1,2) // prints "1, Some 2" t.Opt(1, Some 2) // prints "1, Some (Some 2)"" t.Opt(1, b = Some 2) // prints "1, Some (Some 2)"" t.Opt(1, ?b = Some 2) // prints "1, Some 2""

Я сделаль

Friedrich
18.10.2018
06:17:07
._

Как это работает!

Ayrat
18.10.2018
06:17:25
Это вот так!

круто же

Friedrich
18.10.2018
06:17:51
Ага, окей, то есть опшен туда можно передавать только именованным аргументом!

Grigoriy
18.10.2018
06:17:56
т.е. если он опционально-име..

Friedrich
18.10.2018
06:18:01
@grishace вот так у меня скомпилилось: member this.M(?i : int) = () member this.F() = let x = Some 10 this.M(?i = x)

Grigoriy
18.10.2018
06:18:30
Ля, Фридрихъ! Не успеваю на телефоне набирать, а ты уже

Спасибище!

Google
Friedrich
18.10.2018
06:19:05
Ля, Фридрихъ! Не успеваю на телефоне набирать, а ты уже
А ты набирай асинхронно. Никто не станет тебя ругать за то, что ты медленно напечатал умную мысль (если она умная, конечно) :)

Vasily
18.10.2018
06:19:41
Умные мысли тяжело выразить словами

Grigoriy
18.10.2018
06:20:00
Тут стикеры запрещены :)

Valera
18.10.2018
08:43:16
Подскажите адрес флудилки

Anna
18.10.2018
08:44:58
Igor
18.10.2018
09:03:42
Ребят, может я упустил, но никто же не переводил? http://blog.ploeh.dk/2017/08/07/f-free-monad-recipe/

Ayrat
18.10.2018
09:48:24


не компилятор, а Ionide конечно же



Roman
18.10.2018
09:51:33
А весь код?

Ayrat
18.10.2018
09:51:34
т.е. для него fun x -> (fun y -> x y) === id я чот не понял

это весь код

Roman
18.10.2018
09:52:31
Да, странно

Ilya
18.10.2018
09:54:58
Ну у тебя тут функция, которая принимает функцию. Если id передать тоже функцию, то будет тот же результат

Ayrat
18.10.2018
09:55:15
но у меня два разных параметра

А id умеет работать только так: 'a -> 'a

Ilya
18.10.2018
09:56:26
ну, а если 'a === ('a -> 'b), то получается то же самое

Ayrat
18.10.2018
09:56:45
а если нет?

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