F # проблема соответствия шаблону? - PullRequest
0 голосов
/ 21 февраля 2011

У меня проблема при сопоставлении с F #.Я создаю библиотеку F #, и у меня это пока что:

namespace parser
    module parse =
        let public y = function 
        | x when x.Contains("hi") -> "HELLO" 
        | x when x.Contains("hello") -> "HI" 
        | x -> x

, но это дает мне ошибку: поиск ошибок для объекта неопределенного типа на основе информации до этой программной точки.Аннотации типа могут потребоваться до этой точки программы, чтобы ограничить тип объекта.Это может позволить разрешить поиск.

Ответы [ 2 ]

7 голосов
/ 21 февраля 2011

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

0 голосов
/ 22 февраля 2011

Компилятор хочет знать тип x в вашей функции y, поэтому вам нужно аннотировать его следующим образом:

let y (x: string) =
  match x with
  | x when x.Contains "hi" -> "HELLO"
  | x when x.Contains "hello" -> "HI"
  | x -> x
...