Как объявить несколько литералов только с одним литеральным атрибутом в F #? - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь найти элегантный способ назначения клавиш для символов без необходимости делать что-то вроде следующего.

let [<Literal>] North = ConsoleKey.UpArrow // etc.

Я бы предпочел сделать что-то подобное, используя только один атрибут. Есть ли способ, которым я могу это сделать?

[<Literal>]
type Direction =
    | North of ConsoleKey.UpArrow
    | East of ConsoleKey.RightArrow
    | South of ConsoleKey.DownArrow
    | West of ConsoleKey.LeftArrow

1 Ответ

0 голосов
/ 05 сентября 2018

Предполагая, что ваша цель - использовать их в сопоставлении с образцом, вот один из способов сделать это:

// Use a type alias to shorten the name for ConsoleKey
type Key = ConsoleKey

// Create a general purpose active pattern that simply tests for equality
let (|Is|_|) a b = if a = b then Some () else None

// This is how you would use it
let describeMovement key =
    match key with
    | Is Key.UpArrow -> "up"
    | Is Key.RightArrow -> "right"
    | Is Key.DownArrow -> "down"
    | Is Key.LeftArrow -> "left"
    | _ -> "invalid"
...