2015-05-29 1 views
0

В конце этого заявления:Как понять специфический F # синтаксис

let (a,b,c) = (1,2,3) in printfn "%i,%i" a b;; 

, есть

a b;; 

Что использование окончание «а» и «б», они параметр некоторый вызов функции или, являются ли они возвращаемым значением (кортежем) предыдущей функции? Если да, то каково использование let (a, b, c), я предполагаю, что он должен определить кортеж из трех элементов, но что здесь делает printfn в инструкции?

Другими словами, как я могу разделить это сложное утверждение на несколько более коротких утверждений, которые легче понять? Я не оставляю семантику «let ... in». Любые объяснения?

спасибо.

+2

а и Ь являются аргументы PRINTF –

ответ

12

let (a,b,c) = (1,2,3) in ... означает: внутри...a должен иметь значение 1, b должны иметь значение 2 и c должны иметь 3 (и те привязок будет существовать только внутри ... тела - это все одно выражение - результат будет вне зависимости от результата ... есть)

Чтобы сделать это кортеж (1,2,3) получить с уничтожены в шаблон (a,b,c)

В настоящее время в стороне ... is printfn "%i,%i" a b - printfn "%i,%i" скомпилирован в функцию, которая принимает два целых числа (в картонной форме) и распечатывает их (с , между ними).

Как вы можете видеть, эту функцию вы вызываете с аргументами a и b (помните эти значения сверху).

В целом вы напечатаете 1,2

в c get`s игнорируется, так и другой способ написания было бы

let (a,b,_) = (1,2,3) in printfn "%i,%i" a b 
1

В in ключевых словах группируют промежуточные привязки в один выражения как против более последовательности императивного стиля отдельных заявлений. OCAML (из которого следует F #) требует этого синтаксиса, ориентированного на выражение, во многих случаях. F # позволяет создать более ориентированную на утверждение структуру.

Вы можете думать об этом как разница между этими различными (но эквивалентными) способами описания вашей программы на английском языке:

  • «В дальнейшем, пусть а = 1 и Ь = 2: Печать«а , b 'на консоль "(стиль выражения - промежуточные привязки просто« переходят »в тело окончательного выражения)
  • « Установите a в 1. Затем установите b на 2. Затем напечатайте «a, b» на консоли ,"(Стиль заявления - каждый шаг отличается, и есть меньше ощущения, что это все группы вместе)

Последняя формулировка будет соответствовать следующему коду, который делает то же самое, что и оригинал:

let a = 1 
let b = 2 
printfn "%i,%i" a b 

[примечание - ответ Карстен является большим WRT де-кортежей и неиспользованная c, поэтому я сосредоточился на in]