Преобразовать вложенное выражение соответствия в функцию - PullRequest
1 голос
/ 10 ноября 2019

У меня есть несколько вложенных Дискриминационных Союзов

type Job = Sniff | Guard
type Dog = Chihuahua | GermanShepherd of Job

Вот функция, которая принимает Dog и возвращает string.

let dogPrinter d =
    match d with
    | Chihuahua -> ""
    | GermanShepherd g ->
        match g with
        | Sniff -> ""
        | Guard -> ""

Я могу преобразовать первое match к синтаксису function:

let dogPrinter = function
    | Chihuahua -> ""
    | GermanShepherd g ->
        match g with
        | Sniff -> ""
        | Guard -> ""

Как преобразовать второй match в function?

Ответы [ 3 ]

5 голосов
/ 10 ноября 2019

Идиоматический способ избежать вложенных совпадений в подобных сценариях состоит в том, чтобы использовать вложенные шаблоны:

let dogPrinter = function
    | Chihuahua -> ""
    | GermanShepherd Sniff -> ""
    | GermanShepherd Guard -> ""

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

1 голос
/ 10 ноября 2019

Хотя я думаю, что ответ @glennsl - это то, что вы должны рассмотреть, вот ответ на вопрос, который попросил ОП:

type Job = Sniff | Guard
type Dog = Chihuahua | GermanShepherd of Job

let dogPrinter = function
    | Chihuahua -> "Voff"
    | GermanShepherd g ->
      g |> (  function 
              | Sniff -> "Sniff"
              | Guard -> "Guard"
            )
1 голос
/ 10 ноября 2019

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

let jobPrinter = function
  | Sniff -> ""
  | Guard -> ""

let dogPrinter = function
  | Chihuahua -> ""
  | GermanShepherd job -> job |> jobPrinter
...