Как использовать параметр функции в качестве литерала для сопоставления с образцом в F #? - PullRequest
0 голосов
/ 18 марта 2011

Как мне написать функцию сопоставления, которая берет две строки и сравнивает их друг с другом? Прямо сейчас у меня есть это. Первый не работает. Есть ли лучший способ?

let matchFn ([<Literal>]matchString) (aString : string) = match aString with
                                                            matchString -> true
                                                            | _ -> false

let matchFn (matchString : string) (aString : string) = match aString with
                                                          _ when (matchString = aString) -> true
                                                          | _ -> false

Ответы [ 2 ]

4 голосов
/ 18 марта 2011

В этом конкретном случае вы, конечно, могли бы просто написать aString = matchString, но я полагаю, вы спрашиваете об общем случае. Литералы допускаются только на уровне модуля, и они должны иметь простое константное выражение справа ( source ).

Однако вы можете использовать активный шаблон для подобных случаев. Например (от здесь ):

let (|Equals|_|) expected actual = 
  if actual = expected then Some() else None

и затем используйте его так:

let matchFn (matchString : string) (aString : string) =
   match aString with
   | Equals matchString -> true
   | _ -> false
1 голос
/ 18 апреля 2011

Вы можете использовать защищенный матч:

let matchFn matchString (aString : string) = match aString with
                                                 x when x = matchString -> true
                                                 | _ -> false

или, возможно, более идиоматически:

let matchFn (matchString:string) = function
    | x when x = matchString -> true
    | _ -> false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...