我开始编写一个有趣的玩具命令行数据存储.我目前将解释器的所有命令存储在一个映射中,该映射将命令的字符串名映射为键,并将要执行的方法映射为其值.但是,DisplayHelp
命令需要引用Commands
的第Map
个命令.DisplayHelp
方法、Commands
map 和InterpCommand
代码都如下所示:
let private DisplayHelp (shellState : ShellState) =
printfn "Available commands: "
Commands // <- This is where mutual recursive reference occurs
|> Map.map (fun k _ -> printfn "%s" k)
|> ignore
shellState
let private Commands =
[
"exit", Exit
"help", DisplayHelp // <- This is the other place where mutual reference recursion occurs
"store", StoreItem
"list", ListItems
]
|> Map.ofList
let private InterpCommand (shellState : ShellState) =
let nextState =
match Commands.Keys.Contains shellState.Command with
| true ->
shellState
|> Commands[shellState.Command]
| false ->
shellState
|> DisplayUnrecognizedCommand
// return
nextState
|> ResetStateInputs
正如您所看到的,在DisplayHelp
方法和Commands
映射之间发生了相互递归.我试图使用and
关键字来共同定义这些,但这似乎是一种糟糕的做法.这里使用的正确模式是什么,或者问题本身是以完全不同的方式解决的吗?