Size: a a a

2020 November 07

ML

Müggel Lacus in F# Chat
Здравствуйте, я только начала изучать F# и захотелось поиграться с примерами из книжки
источник

ML

Müggel Lacus in F# Chat
в общем
источник

ML

Müggel Lacus in F# Chat
откуда вывелся тип int, если тут его однозначно нельзя определить?
источник

ML

Müggel Lacus in F# Chat
👀
источник

ML

Müggel Lacus in F# Chat
к примеру, инит может быть строкой
источник

IC

Ilya L Che in F# Chat
А sum где-нибудь вызывается?
источник

ML

Müggel Lacus in F# Chat
нет, это просто функция без контекста, если ее в репл вызвать, то она будет ругаться, если ей отдать массив из строк, например
источник

((

(fun () -> ()) in F# Chat
Müggel Lacus
откуда вывелся тип int, если тут его однозначно нельзя определить?
для + дефолтно выводит int
источник

ML

Müggel Lacus in F# Chat
Оу, вот как
источник

ML

Müggel Lacus in F# Chat
Спасибо
источник

VK

Vladislav Khapin in F# Chat
Müggel Lacus
откуда вывелся тип int, если тут его однозначно нельзя определить?
+ сводится к инту по дизайну
источник

VK

Vladislav Khapin in F# Chat
Без let inline
источник

((

(fun () -> ()) in F# Chat
хочешь что было общее - пиши let inline sum
источник

ML

Müggel Lacus in F# Chat
Попробовала написать ниже применения, тип действительно начал на стринг меняться
источник

ML

Müggel Lacus in F# Chat
Уф, спасибо, это тоже работает
источник

RM

Roman Melnikov in F# Chat
Субботний вечер время напомнить, что у нас есть кроме этого чата сугобо про F# ещё пара тематических и не очень групп:
@fsharp_flood - флудильня на свободные темы, споры про то какой язык лучше, во что поиграть и тд и тп все тут, но так же дружелюбно;
@fsharp_jobs - вакансии на F#, не много, но всё зависит от вас, чем активнее мы как сообщество, тем больше вакансий;
@fsharp_news - канал с новостями, впрочем все новости так сюда транслируются, интересные ссылки из чата так же попадают в телевизор!
источник

NK

ID:0 in F# Chat
источник
2020 November 08

AH

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

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

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

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

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

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

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

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


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

AH

Ayrat Hudaygulov in F# Chat
ебать я написал
источник

EM

Edward Muradov in F# Chat
Хорошо написал, не придерёшься
источник