Частичное применение с изменением типа возврата

#f#

Вопрос:

У меня есть функция для считывания байта из массива:

 let readByte array address =   (* []<byte> -> int -> byte *)
    (* ... *)
 

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

 let myOtherFunction array =
    let readByteAsInt = readByte array
    (* ... *)
    let x = readByteAsInt address
 

В принципе, это работает. В моем примере x сейчас есть тип byte , но он мне понадобится как int . В этом простом примере я мог бы привести возвращаемое значение при назначении x , но, как я уже сказал, я использую readByteAsInt его очень часто и не хочу выполнять приведение при каждом вызове.

Я пытался

 let readByteAsInt = int (readByte array)
 

и

 let readByteAsInt = readByte array |> int
 

но и то и другое приводит к ошибке при вызове readByteAsInt :

FS0003: Это значение не является функцией и не может быть применено

Как я могу изменить тип возврата частичного приложения?

Изменение подписи readByte для возврата int не является вариантом, так как мне нужно byte в другом месте.

Ответ №1:

readByte array это функция, и int это еще одна функция; вы хотите составить их так, чтобы выходные readByte array данные стали входными int данными . Вы можете написать readByte array >> int — обратите внимание, что это >> для композиции, а |> не для применения.

Ответ №2:

Как упоминал @kaya3, вы можете использовать композицию функций с (<<) или (><) или (>>). Но даже без приложения функции или композиции вы могли бы просто создать другую функцию непосредственно с параметром вместо этого.

 let readByteAsInt pos = int (readByte array pos)
let readByteAsInt pos = readByte array pos |> int
 

Или способ компоновки функций

 let readByteAsInt = int << readByte array
let readByteAsInt = readByte array >> int
 

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