В F # может ли выражение совпадения «провалиться» в другое совпадение? как в C # или C ++? - PullRequest
1 голос
/ 24 октября 2019

в C ++ вы можете перейти к конструкции switch / case и опустить разрыв в операторе case, чтобы выполнить падение в следующем случае.

в C #, это делается с помощью goto case.

Можно ли это сделать на примере F #?

AC #, чтобы проиллюстрировать:

switch (a)
case "a":
    ...
    break;
case "b":
    ...
    goto case "a"
case "c":
    ...

Я мог бы представить что-то вроде:

match x with
| "a" -> ...
| "b" -> ...  + goto "a"

практический пример будетбыть случаем, когда:

  • «a» выполняет некоторую операцию
  • «b» сбрасывает счетчик и затем выполняет ту же операцию, что и «a»

и вы хотели бы избежать дублирования кода, а также поместить код во внешнюю функцию.

Ответы [ 2 ]

4 голосов
/ 24 октября 2019

F # - язык, основанный на выражениях, поэтому он не имеет таких императивных функций, как goto. Тем не менее, вы все еще можете выразить ту же логику. Прежде всего, вы можете комбинировать 'case':

let test str =
   match str with
   | (null|"") -> printf "empty"
   | str -> printf "String: [%s]" str

И, конечно, если вы хотите повторно использовать только часть какой-то логики case, вы можете извлечь это в локальной функции:

let test str =
   let onEmpty() = printf "empty!!!"
   match str with
   | null ->
       onEmpty()
       printf "null!"
   | "" -> onEmpty()
   | str -> printf "String [%s]" str
1 голос
/ 29 октября 2019
let aFun() = ...
let bFun() = ...
let abFun() = aFun >> bFun

или как этот, какой лучше для вашей ситуации

let abFun() = 
     aFun() |> ignore
     bFun()

F # заставляет вас делать вещи более функциональными. goto является обязательным оператором

match x with
| "a" -> aFun()
| "b" -> abFun()
...