именно потому что его нельзя однозначно в рантайме определить (нет таких констрейнов на дженерик в CLR), фшарп выбирает первый попавшийся.
А первый попавшийся констрейн тут это оператор (+).
А первый попавшийся тип на этот констрейн тут - int32
поэтому компилятор первым делом резолвит что (+) применяется для интов, и результат тоже инт, а дальше он раскручивает клубок инфиренса до конца.
Чтобы сделать эту функцию "дженерик" по отношению типов оператора сложения, надо обмануть рантайм и отресолвить типы в компайл тайме.
Для этого в фшарпе есть возможность проверки типов в компайл тайме через инлайн функции по месту вызова и резолва там же.
Называется SRTP - statically resolved type parameters
Такие функции обладают странными сигнатурами, обязательно должны быть помечены как инлайн и их скомпилировать сможет только компилятор фшарпа.
Оператор (+) как раз и есть пример такой инлайн функции, но чтобы его магия работала и дальше, вызывающая функция тоже должна быть инлайн.
Поэтому тебе достаточно сделать:
let inline sum inputs init = ...
и внезапно твою сумму можно будет вызывать для любого типа, который объявляет оператор (+), потому что такой дженерик констрейн уже будет чекать не рантайм (который не может), а компилятор фшарпа по месту инлайна (который может)