Как [<Literal>] отличается от других констант в F #
Я немного смущен ключевым словом Literal и почему это необходимо в F #.
Чтение документов, мне кажется, что [<Literal>]
используется для определения константы, однако я немного смущен, как эта константа отличается от всех других констант в F #..
Значения, которые предназначены для констант, могут быть отмечены значком Литеральный атрибут. Этот атрибут влияет на значение быть скомпилирован как константа.
Когда я думаю о константе, я думаю о чем-то непреложном....
let x = "a" + "b" //this is a immutable value, its value is constant
[<Literal>]
let y = "a" + "b" //this is also a immutable value, but why is this a special constant?
Это потому, что "нормальные" значения F # оцениваются лениво и [<Literal>]
не оценивается лениво.? это то, что они подразумевают под "скомпилированным как постоянное".? или есть что-то еще?
Ответы
Ответ 1
В вашем примере x
- неизменяемое значение, которое назначается во время выполнения (но НЕ оценивается лениво), тогда как y
назначается во время компиляции. В качестве примера,
let myDLL = "foo.dll"
[<DllImport(myDLL, CallingConvention = CallingConvention.Cdecl)>]
extern void HelloWorld()
не будет работать, поскольку DllImport является атрибутом и должен знать значение myDLL
во время компиляции. Однако это будет работать:
[<Literal>]
let myDLL = "foo.dll"
[<DllImport(myDLL, CallingConvention = CallingConvention.Cdecl)>]
extern void HelloWorld()
Ответ 2
Если вы пришли из фона С#, вы можете представить значения Literal
в качестве полей const
и нелитеральные как поля readonly
. Те же различия применяются.
Ответ 3
Я думаю, что лучший пример - это то, что происходит в match
.
Это не делает то, что вы ожидаете:
let t = 3
match q with
|t -> printfn "this always happens"
|_ -> printfn "this never happens" //and produces a compiler warning
с другой стороны:
[<Literal>]
let t = 3
match q with
|t -> printfn "q is 3"
|_ -> printfn "q isn't 3"
Итак, здесь, когда Literal
является константой времени компиляции, мы можем использовать ее для сопоставления с образцом.