Как передать конкатенацию строк в функцию в f # - PullRequest
0 голосов
/ 15 апреля 2020

Как передать оператор конкатенации строк (я не хочу использовать ^) для функции?

Если я пытаюсь создать переменную: let x = (+) компилятор говорит, что x имеет тип int -> int -> int. Как я могу аннотировать x, чтобы он работал со строками?

1 Ответ

2 голосов
/ 15 апреля 2020

ОБНОВЛЕННЫЙ ВОПРОС: Чтобы ответить на ваш обновленный вопрос - оператор + является обобщенным c и использует ограничения члена stati c для работы с любым типом, который его поддерживает. Это теряется, если вы используете его в функции или присваиваете его переменной. Один из способов сохранить это свойство - определить функцию inline.

let x1 = (+)               // Type constrained, because it's not a function
let x2 a b = (+)           // Type constrained, because it's not `inline`
let inline x3 = (+)        // Error: only functions can be `inline`
let inline x4 a b = a + b  // Works and you can use `x4` with strings and ints

ОРИГИНАЛЬНЫЙ ОТВЕТ: В вашей ситуации должно быть что-то еще, что вы не показываете в ваш вопрос. Если вы просто откроете новый файл сценария F #, сработает следующее:

let funInt (f:int -> int -> int) = f 1 2
let funStr (f:string -> string -> string) = f "hi" "there"

funInt (+)
funStr (+)

Теперь я не уверен, что еще у вас есть в коде, который вызывает ошибку. Я могу подумать об одной возможности, если вы переопределите оператор + - если у вас есть новое определение, отличное от inline, вы получите описанную ошибку:

let funInt (f:int -> int -> int) = f 1 2
let funStr (f:string -> string -> string) = f "hi" "there"

let (+) a b = a + b

funInt (+)
funStr (+)

Может Вы публикуете минимальный воспроизводимый пример, иллюстрирующий проблему?

...