Size: a a a

2021 June 30

AH

Ayrat Hudaygulov in F# Chat
PR вроде активный
https://github.com/dotnet/fsharp/pull/6805
источник

ДБ

Дмитрий Башинский... in F# Chat
ага
источник

ДБ

Дмитрий Башинский... in F# Chat
а сколько времени на такое нужно?
источник

ДБ

Дмитрий Башинский... in F# Chat
это будет вот вот? или ждать F# 6?
источник

AH

Ayrat Hudaygulov in F# Chat
хз..
источник

IC

Ilya L Che in F# Chat
Скорее 7.
источник

ДБ

Дмитрий Башинский... in F# Chat
😞😞
источник

IC

Ilya L Che in F# Chat
В 6 будут продвинутые CE, если повезёт.
источник

VS

Vladimir Shchur in F# Chat
спроси там в комментах к PR
источник

ДБ

Дмитрий Башинский... in F# Chat
Помогите написать SRTP для метода с 2 параметрами
с 1 норм
let inline (|HasShow|) x = (^a : (static member Show : ^a -> string)x)
а 2 не как
let inline (|HasMap|) f x = (^x : (static member Map : (^x * 'a -> 'b) -> ^z)x, f)
источник

ДБ

Дмитрий Башинский... in F# Chat
хочу достать static member Map : ('a -> 'b * ^x) -> ^z
источник

VK

Vladislav Khapin in F# Chat
странный код
источник

VK

Vladislav Khapin in F# Chat
let inline (|HasMap|) f = (^x : (static member Map : (^x * ^a -> ^b) -> ^z) f)
источник

AK

Alex K in F# Chat
что такое SRTP?
источник

P

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

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

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

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

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

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

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

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


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

VS

Vladimir Shchur in F# Chat
вместо (^x * 'a -> 'b) попробуй  ^x * ('a -> 'b)
источник

ДБ

Дмитрий Башинский... in F# Chat
спс
источник

ДБ

Дмитрий Башинский... in F# Chat
let inline (|HasMap|) f x = (^x : (static member Map : ^x * ('a -> 'b) -> ^z) x, f)
let inline map f (HasMap f x) = x
источник

ДБ

Дмитрий Башинский... in F# Chat
https://gist.github.com/BashkaMen/8eeaf56db34c66b90eeaa7de16299081
теперь у меня есть сниппет для почти тайпклассов
источник

VS

Vasily Shapenko in F# Chat
Ошибка в сниппете
источник