F#4: Позволить/Использовать/Сделать

В этом посте мы рассмотрим привязки в F#, в частности Let/Use/Do. Теперь вы, возможно, задаетесь вопросом, что такое якоря, и поскольку мы их еще не рассмотрели, сейчас самое время поговорить об этом.

Проще говоря, привязка связывает идентификатор со значением или функцией.



Давайте

Ключевое слово let используется для связи имени со значением или функцией.

На самом деле существуют различные варианты использования Let: один из них объявляется на верхнем уровне модуля, а затем другой, где мы определяем некоторый локальный контекст. Вот пример того и другого:

  
  
  
  
  
  
   

module DemoModule = let someFunction = let a = 1 let b = 2 a * b

Мы могли бы получить доступ к someFunction, используя полное имя, например DemoModule.someFunction, но вложенные привязки Let(a, b) доступны только для Let верхнего уровня.

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

Итак, давайте посмотрим еще несколько примеров

let aString ="this is a string" let aInt = 12 let aDecimal = 12.444 let aPiFunction () = Math.PI let aSquareRootFunction (x) = Math.Sqrt(x) let aFullyTypedSquareRootFunction (x :float) = Math.Sqrt(x) let a,b = "a","tuple"

Как видите, мы можем использовать привязку Let для привязки к многочисленным значениям, которые могут быть разных типов, например:

  • Целое число
  • Десятичное число
  • Функция без входных параметров
  • Функция с входными параметрами (где система вывода типа F# правильно выберет тип)
  • Функция, имеющая полностью определенные типы параметров.

  • Кортеж (в данном случае кортеж String * String)
В другом месте вы можете увидеть привязку Let в классе, но мы рассмотрим это более подробно в следующей статье этой серии.

Подробнее о привязке Let можно прочитать на сайте MSDN.

Использовать

Привязка Use очень похожа на привязку Let в том смысле, что она привязывает значение к результату выражения.

Основное отличие состоит в том, что привязка Usage предназначена для работы с типами IDisposable и автоматически удаляет значение, когда оно больше не находится в области видимости.

Это очень похоже на ключевое слово using в .

NET, хотя я не верю, что привязка Use F# будет точно такой же, как ключевое слово using в .

NET, поскольку ключевое слово using в .

NET на самом деле представляет собой попытку/наконец с вызовом Dispose. ( ) наконец.

Мы уже видели пример привязки «Использовать» в последнем посте о форматировании текста, но чтобы напомнить себе, давайте посмотрим на него еще раз.



use sw = new StreamWriter(@"c:\temp\fprintfFile.txt") fprintf sw "This is a string line %s\r\n" "cat" fprintf sw "This is a int line %i" 10 sw.Close()

В этом примере привязка Use гарантирует, что метод StreamWriter вызовет свой метод Dispose() после вызова sw.Close(), показанного выше.

Использование работает только с IDisposables, и вы получите ошибку компиляции, если попытаетесь использовать его с чем-либо еще, как показано ниже:

F#4: позволить/использовать/сделать

Поскольку метод Dispose() вызывается в конце привязки Use, следует позаботиться о том, чтобы не вернуть значение, которое было привязано с помощью Let.

let Write = use sw = new StreamWriter(@"c:\temp\fprintfFile.txt") sw

Если вам абсолютно необходимо передать обратно IDisposable, являющиеся частью привязки Use, вместо этого вы можете использовать обратный вызов.

Что-то вроде этого будет работать, но я бы остановился и спросил себя, правильно ли вы спроектировали свой дизайн, если делаете такие вещи:

let Write callback = use sw = new StreamWriter(@"c:\temp\fprintfFile.txt") fprintf sw "Write is writing to the StreamWriter" callback sw sw let callback sw = fprintf sw "sw is the StreamWriter" let disp = Write callback



Делать

Привязка do используется для выполнения кода без определения функции или значения.

A Привязка ДОЛЖНА всегда возвращать Unit (нет значения/void).

Во многих случаях вы сможете опустить привязку Do, и все будет работать как положено.

Вот несколько примеров использования привязки Do.

do printf "doing the do" //oh oh not a unit do printf "print a sum %i" 1 + 1 do 1 + 1

Если вместо этого я покажу вам скриншот приведенного выше кода, вы увидите, что компилятор будет жаловаться, если вы попытаетесь использовать Do с результатом, отличным от Unit.

F#4: позволить/использовать/сделать

У вас есть два варианта:

  • Используйте оператор конвейера, чтобы игнорировать результат
  • Создайте привязку let
Ниже я показал пример каждого из них:

let x = 1 + 1 do printf "print a sum %i" x do (1+1 |> ignore)



Пойдем! Использовать! Делать!

Хотя я пока не хочу их обсуждать, иногда вы можете увидеть Let! Использовать! Do!, и когда вы это делаете, это часть так называемого вычислительного выражения.

Скорее всего, вы увидите это в асинхронных рабочих процессах F#, которые мы рассмотрим в одной из последних статей.

Если я достаточно осведомлен, я мог бы даже попытаться объяснить, как можно создать собственное «Вычислительное выражение», хотя это довольно абстрактное понятие и довольно сложная тема, так что сейчас для них не время.

Теги: #.

NET #F#

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.