В этом посте мы рассмотрим привязки в F#, в частности Let/Use/Do. Теперь вы, возможно, задаетесь вопросом, что такое якоря, и поскольку мы их еще не рассмотрели, сейчас самое время поговорить об этом.
Проще говоря, привязка связывает идентификатор со значением или функцией.
Давайте
Ключевое слово let используется для связи имени со значением или функцией.На самом деле существуют различные варианты использования Let: один из них объявляется на верхнем уровне модуля, а затем другой, где мы определяем некоторый локальный контекст. Вот пример того и другого:
Мы могли бы получить доступ к someFunction, используя полное имя, например DemoModule.someFunction, но вложенные привязки Let(a, b) доступны только для Let верхнего уровня.module DemoModule = let someFunction = let a = 1 let b = 2 a * b
Обычно вы увидите больше случаев, когда мы используем привязку 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 можно прочитать на сайте 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, и вы получите ошибку компиляции, если попытаетесь использовать его с чем-либо еще, как показано ниже:
Поскольку метод 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.
У вас есть два варианта:
- Используйте оператор конвейера, чтобы игнорировать результат
- Создайте привязку let
let x = 1 + 1
do printf "print a sum %i" x
do (1+1 |> ignore)
Пойдем! Использовать! Делать!
Хотя я пока не хочу их обсуждать, иногда вы можете увидеть Let! Использовать! Do!, и когда вы это делаете, это часть так называемого вычислительного выражения.Скорее всего, вы увидите это в асинхронных рабочих процессах F#, которые мы рассмотрим в одной из последних статей.
Если я достаточно осведомлен, я мог бы даже попытаться объяснить, как можно создать собственное «Вычислительное выражение», хотя это довольно абстрактное понятие и довольно сложная тема, так что сейчас для них не время.
Теги: #.
NET #F#
-
Как Локализовать Ключевые Слова
19 Oct, 24 -
Однозначный Переключатель Раскладки
19 Oct, 24 -
Nat На Cisco. Часть 1
19 Oct, 24 -
Почему 3D-Печать? Архитектура
19 Oct, 24 -
Фиолетовая Корова
19 Oct, 24 -
Кто Победит? —Ii
19 Oct, 24