По сути, компилятор не понимает, что вы хотите, чтобы аргумент вашей функции был типа string
.По сути, вы НЕ можете вызывать методы экземпляра для неявно объявленных аргументов функции.Вам нужно будет использовать что-то вроде следующего.
let y (value:string) =
match value when
| x when x.Contains("hi") -> "HELLO"
| x when x.Contains("hello") -> "HI"
| x -> x
Интересно, если бы вы не вызывали метод экземпляра, а вместо этого использовали его каким-либо другим способом (где тип уже был известен), вы быбыть в порядке.Другими словами, предположим, что модуль StringUtils
содержит метод Has
, который принимает две строки и выполняет ту же проверку, что и Contains
;если это так, вы могли бы использовать неявный аргумент, поскольку компилятор уже знает, какого типа должно быть значение.
module StringUtils =
let has (word:string) value = word.Contains(value)
module Parse =
let y = function
| x when x |> StringUtils.has "hi" -> "HELLO"
| x when x |> StringUtils.has "hello" -> "HI"
| x -> x
Очевидно, что во многих случаях подобные вещи не нужныподробный.Но это демонстрирует большую точку зрения на поведение вывода типа F #.