【发布时间】:2018-05-08 18:07:27
【问题描述】:
我对 F# 很陌生,我正在尝试使用递归来解决问题。
函数接收一个字符串,并返回一个布尔值。字符串被解析和评估。这是布尔逻辑,所以
- (T|F) 返回真
- (T&(T&T)) 返回真
- ((T|T)&(T&F)) 返回假
- (F) = 返回错误
我的想法是,每次找到 a ) 时,将字符串中前一个 ( to that ) 的部分替换为比较匹配的结果。一遍又一遍地这样做,直到只剩下 T 或 F,以返回 true 或 false。
编辑: 我希望它能够获取字符串,并不断用比较结果替换 ( 和 ) 之间的内容,直到它归结为 T 或 F。发生的情况是关于不完整的结构化构造的错误。错误在for循环中。
由于我对这种语言还很陌生,我不确定自己做错了什么。看到了吗?
let ComparisonSolver (comp:string) =
let mutable trim = comp
trim <- trim.Replace("(", "")
trim <- trim.Replace(")", "")
match trim with
| "T" -> "T"
| "F" -> "F"
| "!T" -> "F"
| "!F" -> "T"
| "T&T" -> "T"
| "F&F" -> "T"
| "T&F" -> "F"
| "F&T" -> "F"
| "T|T" -> "T"
| "F|F" -> "F"
| "T|F" -> "T"
| "F|T" -> "T"
| _ -> ""
let rec BoolParser arg =
let mutable args = arg
if String.length arg = 1 then
match arg with
| "T" -> true
| "F" -> false
else
let mutable ParseStart = 0
let endRange = String.length args
for letter in [0 .. endRange]
if args.[letter] = "(" then
ParseStart <- letter
else if args.[letter] = ")" then
args <- args.Replace(args.[ParseStart .. letter], ComparisonSolver args.[ParseStart .. letter])
BoolParser args
let result = BoolParser "(T)&(F)"
【问题讨论】:
-
您预计会发生什么,以及正在发生什么?
-
我希望它获取字符串,并不断用比较结果交换 ( 和 ) 之间的内容,直到它归结为 T 或 F。正在发生的事情是关于不完整的结构化构造的错误。
-
不,我的意思是你的具体直接问题是 - 你的代码甚至没有编译,因为你在
for循环周围遇到错误。把它放在问题中很重要,因为它可以让人们知道他们所看到的是否就是你所看到的,这样他们就不会开始试图在错误的地方帮助你。 -- 编辑:是的,就像那样。始终尽可能准确地说明您要解决的问题。 -
感谢您的提示,我现在将其编辑到主帖中。
标签: parsing recursion f# boolean