Dr. Friedrich
google://how to record gifs like a boss
google://how to record gifs like a Vasily
Romɑn
Dr. Friedrich
Найсовая гифка у тебя вышла!
gsomix
gsomix
https://www.cockos.com/licecap/
Romɑn
Dmitry
Romɑn
Dmitry
Чо?
Romɑn
ее, получилось! ))
Спасибо gsomix!
Romɑn
Dr. Friedrich
gsomix
Romɑn
Чо?
гифка со звуком локальный леперский ем
Dmitry
Крылатый
Vladislav
Romɑn
блин, у меня нормально записалось
Romɑn
Dmitry
Igor
Каламбуры подъехали
Igor
Dmitry
Romɑn
так лучше?
Romɑn
Pavel
оригинально =D
Éminence grise
Коллеги, это что https://stackoverflow.com/a/8376001? Это реально так писать столько бойлера? Что то я не догоняю - совсем с этим плохо похоже.
gsomix
Vasily
Ну как бы логично
Vasily
На type extension перегрузка операторов не распространяется
Éminence grise
Я вообще тогда не понимаю, зачем нам называть ЭТО operator overloading/ Это operator overriding/ Бессмыслнный и жестокий.
gsomix
gsomix
Для своих типов перегрузить оператор очень просто.
Vasily
Соглашусь с @gsomix в кои-то веки
gsomix
Ivan Ждем в F#5. :)
https://github.com/Microsoft/visualfsharp/pull/3582
Éminence grise
У меня есть тип int, у него есть +/У меня есть собственно определенный + для листов. Типы разные. Почему не работает + для интов? Где логика типов?
gsomix
Igor
Éminence grise
type Microsoft.FSharp.Collections.List<'a> with
static member (+) (first: List<'a>, second: List<'a>) =
first.Concat(second)
Vasily
Это type extension
Éminence grise
Все плюс для интов не работает
gsomix
gsomix
Он не работает, потому что дальше оператор переопределили локально.
let inline (+) a b = (?<-) ListExtension a b
gsomix
Éminence grise
Нет - без инлайнов и каких либо ухищрений
Igor
Vasily
Хммм... а ведь match! уже подвезли , похоже
gsomix
Éminence grise
Собственно пытаюсь добавить >=> и в резалт и в опшенс. Перекрывает все. Все что видит. Ну я конечно не настолько спец, чтоб уж просто офигеть. Но как операция над одним типом перекрывает операцию над другим? Насмерть. Только вот такой ворк эроунд нашел
Vasily
Иван, тебе сюда : https://github.com/fsharp/fslang-design/blob/master/RFCs/FS-1043-extension-members-for-operators-and-srtp-constraints.md
gsomix
Igor
Éminence grise
Ловите:
open System
let (+) a b = a |> List.append b
[<EntryPoint>]
let main argv =
printfn "Hello World from F#!"
let c = 4 + 5
gsomix
gsomix
Конечно, у тебя не будет работать для int теперь.
Vasily
Кстати, да
gsomix
Что нужно понять: (+) — это обычная функция, которую можно перекрыть локально.
gsomix
Как и любую другую.
Éminence grise
+ -это оператор. Он по умолчанию имеет два параметра. На него не распространяются проблемы выбора типов для оверлоада. На фига такой неестественный геморрой? Понять могу, и все ваши аргументы то же. Но - это не фига не логично. То есть совсем
gsomix
gsomix
(+) — это обычная функция.
Éminence grise
Лови декомпиляцию:
[CompilationMapping]
public static class Program
{
[CompilationArgumentCounts(new int[] {1, 1})]
public static FSharpList<a> operator +(FSharpList<a> a, FSharpList<a> b)
{
return ListModule.Append<a>(b, a);
}
[EntryPoint]
public static int main(string[] argv)
{
ExtraTopLevelOperators.PrintFormatLine<Unit>((PrintfFormat<M0, TextWriter, Unit, Unit>) new PrintfFormat<Unit, TextWriter, Unit, Unit, Unit>("Hello World from F#!"));
FSharpList<int> fsharpList = (FSharpList<int>) (FSharpList<int>.Cons(4, FSharpList<int>.get_Empty()) + FSharpList<int>.Cons(5, FSharpList<int>.get_Empty()));
return 0;
}
}
gsomix
Я не вижу смысла продолжать разговор.
Éminence grise
Это обычная функция?
gsomix
Были бы мы в основном чате — отправил бы читать спеку.
Éminence grise
На ней же атрибут висит.
Éminence grise
Да читал я спеку. Потому и не в основной чат пишу. Я как раз и не понимаю почему так?
Ayrat
Декомпиляция тут не роляет, т.к. это C# код, а F# живёт по спеке. И вот по спеке let (+) это обычное объявление функции, которая затеняет + в типе int
точно так же как let abc затрёт и переопределит все предыдущие abc
Romɑn
Ayrat
я написал шадовинг
Ayrat
а потом подумал
Ayrat
и заменил на ЗАТЕНЯЕТ )))
Vasily
Оттеняет
Éminence grise
Да по спеке я понимаю. Не понимаю зачем? Ведь даже парсер объявление оператора обрабатывается по другому. Почему надо было вводить такие ограничения. Что это дало? Затенило то оно опреатор с другим типом. Я прекрасно понимаю почему в FSharp нет каррированных функций оверлоадов. Там не определишь наличие праметров и их количество. Но операторы то ДЕТЕРМИНИРОВАНЫ в этом отношении. Зачем этого лишать?
Éminence grise
Причем inline как то с таким подходм разбирается. Но ведь в данном случае даже инлайн не нужен. Типя статически могут поддерживать ту или иную операцию. В общем я слегка оболдел, сколько надо написать бойлера, что бы добавить свою операцию, не прикрывая уже существующего определения напрочь.
gsomix
Я подышал.