Я не понимаю одну главу учебника о сопоставлении с образцом в F # - PullRequest
0 голосов
/ 12 июня 2019

на следующей странице: https://fsharpforfunandprofit.com/posts/defining-functions/

есть следующий пример:

type Name = {first:string; last:string} // define a new type
let bob = {first="bob"; last="smith"}   // define a value

// single parameter style
let f1 name =                       // pass in single parameter
   let {first=f; last=l} = name     // extract in body of function
   printfn "first=%s; last=%s" f l

Я не понимаю строку с:

let {first=f; last=l} = name

Iмог бы понять:

{f=first; l=last}

, где ему будет присвоено поле first для f , а для поля last - l , но я не понимаю порядок first = f

как это работает?

Ответы [ 2 ]

4 голосов
/ 12 июня 2019

От вашего вопроса, я думаю, вы понимаете / согласны с способом объявления записи значение :

let bob = {first="bob"; last="smith"}   // define a value

ОК, пошли!

Слевачасть в привязке let (xxx in let xxx = yyy) на самом деле является шаблоном , а не оператором или присваиванием.Вы можете приблизительно представить шаблон как регулярное выражение, в котором вы можете определить некоторые заполнители в шаблоне.

В общем смысле шаблон для значения должен быть в идентичной форме с объявлением значения (yyy в примере).Давайте напишем это, и вы поймете, почему синтаксис имеет смысл:

let {first=f; last=l} = {first="bob"; last="smith"}

Здесь f и l являются заполнителями, и после этой привязки значение f будет "bob", значениеиз l будет "smith".

Я мог бы понять: {f=first; l=last}, где он назначит первое поле для f и последнее поле для l.

Шаблоны могут быть вложенными, поэтому ваша интерпретация будет нарушена, если вы продолжите поиск по шаблонам на f и / или l.Например:

{(Something ff)=first; (Something ll)=last}

Короче говоря, вам следует подумать «присваивать» здесь с точки зрения заполнения значений заполнителями, а не операции присваивания (=) на традиционных языках.

4 голосов
/ 12 июня 2019

Идея состоит в том, что синтаксис всегда { fieldName = something }. Когда вы создаете запись, something - это значение, которое вы присваиваете этому полю. Когда вы сопоставляете шаблон, something - это переменная, к которой вы привязываете значение поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...