#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#, когда функция имеет общий вход, тогда вы должны явно определить функцию с аргументами.