Я думаю, что comefrom
соответствует объявлениям функций даже лучше, чем goto
.
Если вы делаете что-то вроде goto
в F #, то ваша метка соответствует объявлению функции икоманда goto
соответствует вызову функции.В случае comefrom
, команда comefrom
соответствует объявлению функции, а метка соответствует вызову функции.
Используя функции, ваш код выглядит следующим образом ( EDIT: Это то же самое, что уже опубликовал Рамон, но я оставлю здесь ответ, потому что у него есть дополнительное объяснение ):
let rec restart() =
Console.Write "Do you want to restart this program?"
let a = Console.ReadLine()
match a with
| "Y" -> restart()
| _ -> Console.Write "Too bad! It will restart whether you like it or not!"
restart()
Если вы действительно хотите использовать синтаксис, которыйПохоже на команду comefrom
, затем посмотрите на варианты ниже.Тем не менее, я не вижу смысла - если вы адаптируете какой-то устаревший код, вам придется переводить многие другие вещи в F #, а использование странного синтаксиса просто сделает F # менее идиоматичным.Невозможно добавить новую синтаксическую конструкцию real , например comefrom
, в F #.
let rec restart = comefrom (fun () ->
Console.Write "Do you want to restart this program?"
// (omitted)
restart())
// where 'comefrom' is just a trivial wrapper for a function
let comefrom f () = f ()
В качестве альтернативы вы можете определить comefrom
компоновщик вычислений и затем использовать следующий синтаксис:
let rec restart = comefrom {
Console.Write "Do you want to restart this program?"
// (omitted)
return! restart() }
(Этот пост в блоге дает очень простой примерпостроителя вычислений, который вы можете адаптировать)