Подтвердить что ты не робот

Как [<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>] не оценивается лениво.? это то, что они подразумевают под "скомпилированным как постоянное".? или есть что-то еще?

4b9b3361

Ответ 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 является константой времени компиляции, мы можем использовать ее для сопоставления с образцом.