Как показывает ваш пример, методы .NET не всегда хорошо сочетаются - я думаю, что идиоматический подход в таких ситуациях - просто использовать стиль .NET, когда вы имеете дело с библиотеками .NET (и использовать функциональный стиль, когда вымы имеем дело с функциональными библиотеками).
В вашем конкретном случае я бы просто определил нормальную функцию с аннотацией типа и получил бы длину, используя член Length
, а не функцию:
let composedFunction (s:string) =
System.Text.Encoding.UTF8.GetBytes(s).Length
Существующий ответ показывает, как заставить композицию работать с аннотациями типов.Другой трюк, который вы можете сделать (который я бы определенно не использовал на практике), заключается в том, что вы можете добавить функцию идентификации на string
в композицию, чтобы ограничить типы:
let composedFunction = id<string> >> System.Text.Encoding.UTF8.GetBytes >> Array.length
Этозабавно, что это работает, но, как я уже сказал, я бы никогда не использовал это, потому что обычную функцию, как определено выше, гораздо легче понять.