Nikolay
Nikolay
Декомпоузить в 3 функции?
Dr. Friedrich
Щас, погодь, для начала хотя бы туплю давай научимся прокидывать.
Dr. Friedrich
type Test = { A: int } static member staticFn (a: int, b: bool, c: Test) = ()
let inline callStaticFn< ^a when ^a: (static member staticFn: int * bool * ^a -> unit)> x =
(^a: (static member staticFn: int * bool * ^a -> unit) (1, true, x))
()
let check () =
callStaticFn { A = 0 }
Dr. Friedrich
Вот так работает.
Nikolay
Ну с туплей и я могу 🙂
Nikolay
А без тупли не могу :C
Dr. Friedrich
А я не мог!
Dr. Friedrich
Кажется, у меня получилось сделать по-наркомански
Sergey
Народ а с teamcity cmake плагином кто-то работал?
Dr. Friedrich
Ну правильно, ты же не я!
type Test = { A: int } static member staticFn (a: int) = fun (b: bool) (c: Test) -> ()
let inline callStaticFn< ^a when ^a: (static member staticFn: int -> (bool -> ^a -> unit))> x =
(^a: (static member staticFn: int -> (bool -> ^a -> unit)) 1) true x
()
let check () =
callStaticFn { A = 0 }
Dr. Friedrich
Как тебе такое, а?
Dr. Friedrich
Я хз почему нельзя туда несколько аргументов сразу передать
Dr. Friedrich
Но как минимум можно вот так вот по-македонски
Nikolay
Nikolay
Незачёт
Dr. Friedrich
Следующим условием он скажет, что и код нельзя менять
Dr. Friedrich
Ладно, вернёмся к изначальному коду. Он же почему-то ругается только в месте применения? А почему? То есть тело инлайн функции его устроило?
Dr. Friedrich
Типа, так можно чтоли писать через запятую?
Dr. Friedrich
Хм
Dr. Friedrich
Смотри сюда
Dr. Friedrich
type Test = { A: int } static member staticFn (a: int, b: bool, c: Test) = ()
let inline callStaticFn< ^a when ^a: (static member staticFn: int -> bool -> ^a -> unit)> x =
(^a: (static member staticFn: int -> bool -> ^a -> unit) (1, true, x))
()
let check () =
callStaticFn { A = 0 }
Dr. Friedrich
Вот это скомпилировалось.
Dr. Friedrich
Сечёшь?
Dr. Friedrich
Получается, ^a: (static member staticFn: int -> bool -> ^a -> unit) — это такая форма записи статического метода с сигнатурой с туплёй. Не каррированного!
Nikolay
Сечёшь?
Компилятор странный немного
Dr. Friedrich
Очень сильно странный.
Nikolay
По идее он и не должен компилить такое
Dr. Friedrich
Надо ему как-то сказать, что staticFn — это статический метод.
Dr. Friedrich
Кстати, а что это на самом деле-то? :)
Dr. Friedrich
@Dolfik, а это и на самом деле… статический метод.
Dr. Friedrich
https://sharplab.io/#v2:DYLgZgzgNAJiDUAfALgTwA4FMAEAVTEy2AvNgN7YCCI2AlgHZEC+2hAhsrQMbYC2mvAEaYATq2QduAMXrYAFGxoNkASnmCaggPZbgauVxr5Ca0nJVA==
Dr. Friedrich
В смысле, он уже затупленный
Nikolay
В смысле, он уже затупленный
Хм, ну тогда отчасти логично, что он компилит такое: (^a: (static member staticFn: int -> bool -> ^a -> unit) (1, true, x))
Dr. Friedrich
Видать, SRTP смотрит в самую суть вещей, и поэтому видит тут только обычный статик метод.
Nikolay
Баг компилятора?
Dr. Friedrich
Dr. Friedrich
Баг компилятора?
А хер его знает. Давай попробуем отнести в трекер?
Dr. Friedrich
Я прошлый раз носил, теперь твоя очередь!
Nikolay
Ну по идее должен принимать, если один хер он компилитя в туплю
Nikolay
Я же правильно понимаю, что в конечном итоге оно свернется в туплю?
Nikolay
Не важно явно ты указал туплю, или просто параметры
Dr. Friedrich
let inline callStaticFn< ^a > x =
(^a: (static member staticFn: int -> bool -> ^a -> unit) 1 true x)
()
Вот тут он почему-то ругается "Expected 3 expressions, got 1". Есть идеи, как это превратить в три экспрешена? Про что он вообще говорит?
Dr. Friedrich
Думаю, да, это баг в компиляторе.
Андрей
о, и я тут поймал баг в f# канпеляторе. Ругается на анонимные рекорды, только в другом проекте и только в релизе. Думаю как репродуцировать, пушто до сих пор не нашёл что именно ему не нравится
Dr. Friedrich
Ayrat
Ayrat
ну типа (1, true, x)
Dr. Friedrich
Ayrat
Dr. Friedrich
у вызова сртп
Не, там смотри чо. Мы сделали метод, который не получается через SRTP вызвать
Dr. Friedrich
type Test = { A: int } static member staticFn (a: int, b: bool, c: Test) = ()
Вот этот вот
Ayrat
окей, ща попробуем
Ayrat
холд май бир
Ayrat
module Program
type Test =
{ A: int }
static member staticFn (a: int, b: bool, c: Test) = ()
let inline foo (x: ^a) =
(^a: (static member staticFn: int * bool * Test -> unit) 1, true, x)
Ayrat
@fvnever отдавай пиво
Dr. Friedrich
Dr. Friedrich
Меня уже за это отчитали
Ayrat
а чо не так
Dr. Friedrich
Функцию менять нельзя!
Ayrat
я не менял O.o
Ayrat
Dr. Friedrich
Бля, сорян, я не ту скопипастил :(
Dr. Friedrich
type Test = { A: int } static member staticFn (a: int) (b: bool) (c: Test) = ()
Ayrat
да бля
Ayrat
🙂
Dr. Friedrich
Но запутаться было немудрено, тут весь чат в SRTP простынях. Поди найди нужную
Ayrat
Nikolay
static member staticFn (a: int, b: bool, c: Test) = ()
vs
static member staticFn (a: int) (b: bool) (c: Test) = ()
Nikolay
Разница какбэ
Ayrat
ну я ничего не менял.
Ayrat
и к слову я не думаю что это возможно
Ayrat
хотя постойте.
Ayrat
КАЖЕТСЯ МОЖНО
Ayrat
https://github.com/fsprojects/FSharpPlus/blob/3e5be186d2fece1fa3282bc7490f7f1ff97632c3/src/FSharpPlus/Control/Foldable.fs#L149
Ayrat
просто известные наркоманы СРТП кажется подобное юзают