Size: a a a

2020 December 15

VZ

Vlad Zaa in F# Chat
Pavel
Дак работает)..
Если ты про инлайн, то он тебе сртп с констрейнтом на статик op_Plus генерит
источник

AH

Ayrat Hudaygulov in F# Chat
НИЧЕГО НЕ СМУЩАЕТ?
источник

AH

Ayrat Hudaygulov in F# Chat
^a ->  ^a ->  ^a
источник

MS

Michael Snytko in F# Chat
оо там же крышечки сверху
источник

VZ

Vlad Zaa in F# Chat
Pavel
Вот же..
В fsi скопипасть дефинишн
источник

AH

Ayrat Hudaygulov in F# Chat
конечно оно работает...
источник

VZ

Vlad Zaa in F# Chat
И посмотри какую сигнатуру он сгенерит
источник

AH

Ayrat Hudaygulov in F# Chat
на SRTP :D
источник

MS

Michael Snytko in F# Chat
Переслано от Ayrat Hudaygulov
именно потому что его нельзя однозначно в рантайме определить (нет таких констрейнов на дженерик в CLR), фшарп выбирает первый попавшийся.

А первый попавшийся констрейн тут это оператор (+).
А первый попавшийся тип на этот констрейн тут - int32

поэтому компилятор первым делом резолвит что (+) применяется для интов, и результат тоже инт, а дальше он раскручивает клубок инфиренса до конца.

Чтобы сделать эту функцию "дженерик" по отношению типов оператора сложения, надо обмануть рантайм и отресолвить типы в компайл тайме.

Для этого в фшарпе есть возможность проверки типов в компайл тайме через инлайн функции по месту вызова и резолва там же.
Называется SRTP - statically resolved type parameters

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

Оператор (+) как раз и есть пример такой инлайн функции, но чтобы его магия работала и дальше, вызывающая функция тоже должна быть инлайн.

Поэтому тебе достаточно сделать:
let inline sum inputs init = ... 


и внезапно твою сумму можно будет вызывать для любого типа, который объявляет оператор (+), потому что такой дженерик констрейн уже будет чекать не рантайм (который не может), а компилятор фшарпа по месту инлайна (который может)
источник

MS

Michael Snytko in F# Chat
вот у меня в закладках есь
источник

AH

Ayrat Hudaygulov in F# Chat
а как вы закладки делаете...
источник

Д

Дон Макароне🦜... in F# Chat
Ayrat Hudaygulov
а как вы закладки делаете...
в сохраненные сообщения кидать
источник

Д

Дон Макароне🦜... in F# Chat
так и знал)))
источник

P

Pavel in F# Chat
Непонял, обявили с ' а в дефинишене ^ это как понимать?
источник

AH

Ayrat Hudaygulov in F# Chat
Pavel
Непонял, обявили с ' а в дефинишене ^ это как понимать?
это тебе компилятор вывел.
источник

AH

Ayrat Hudaygulov in F# Chat
убери inline и магия кончится
источник

AH

Ayrat Hudaygulov in F# Chat
вернешься в мир дотнета
источник

P

Pavel in F# Chat
Непонятно когда надо тогда самому явно обявлять тип с ^ если компилятор сам заменяет при inline...
источник

AH

Ayrat Hudaygulov in F# Chat
Pavel
Непонятно когда надо тогда самому явно обявлять тип с ^ если компилятор сам заменяет при inline...
потому что там сильно больше магии с этими типами
источник

AH

Ayrat Hudaygulov in F# Chat
Pavel
Непонятно когда надо тогда самому явно обявлять тип с ^ если компилятор сам заменяет при inline...
источник