2015-11-15 2 views
0

Следующая часть кода работает, но для меня это кажется неправильным ... Или, может быть, это просто мое плохое понимание F # ... То, что меня насторожило, - это упорядочение матча в функции проверки соответствия ,Образец сопоставления заказа

open System 

type Adapter = 
    { IP : string 
     MAC : string 
     FriendlyName : string 
     ID : int } 

let (|IsMatchByName|_|) (input : Adapter) (name: string) = 
    match input with 
    | {FriendlyName = friendlyName} when friendlyName = name -> Some() 
    | _ -> None 

let checkmatch (record: Adapter) (name : string) = 
    match name with 
    | IsMatchByName record -> "Match" 
    | _ -> "No match" 

[<EntryPoint>] 
let main argv = 
    let testRecord = {IP ="127.0.0.1"; MAC ="FF:FF:FF:FF:FF:FF"; FriendlyName = "Home";ID = 229229} 
    let result = checkmatch testRecord "Home" 

    Console.WriteLine(result) 
    Console.ReadKey() |> ignore 
    0 // return an integer exit code 

Ниже приведено то, что я ожидаю от функции проверки соответствия. Где я сопоставляю запись и передаю имя в качестве дополнительного параметра. Первый вход IsMatchByName является адаптером, так почему он ожидает ввода в другом порядке?

let checkmatch (record: Adapter) (name : string) = 
    match record with 
    | IsMatchByName name -> "Match" 
    | _ -> "No match" 

ответ

1

Это прямое следствие частичного применения.
Вы частично применяете record к IsMatchByName; получая функцию, которая ожидает строку, заданную условием match.

Это выглядит еще хуже, когда частичный активный шаблон возвращает что-то (не единицу); см., например, here.

Смежные вопросы