非常刚刚开始 - 昨天新来的F#。
我想要的:编写解析字符串“2 + 2”的代码(使用教程项目中的示例代码)Expr.Add(Expr.Num 2,Expr.Num 2)进行评估。有些帮助至少指出了我正确的方向或告诉我这对我的第一个F#项目来说太复杂了。 (这就是我学习东西的方式:通过猛烈抨击那些困难的东西)
我拥有:我最好猜测提取数字的代码。基地可能很糟糕。此外,缺乏线索。
let script = "2 + 2";
let rec scriptParse xs =
match xs with
| [] -> (double)0
| y::ys -> (double)y
let split = (script.Split([|' '|]))
let f x = (split[x]) // "This code is not a function and cannot be applied."
let list = [ for x in 0..script.Length -> f x ]
let result = scriptParse
感谢。
答案 0 :(得分:2)
您遇到的直接问题是split
是一个字符串数组。要访问此数组的元素,语法为split.[x]
,而不是split[x]
(将split
应用于单例列表[x]
,假设它是一个函数。)< / p>
以下是其他一些问题:
list
的定义可能不对:x
的范围最长为script
,而不是数组split
的长度。如果要将数组或其他序列转换为列表,可以使用List.ofSeq
或Seq.toList
而不是显式列表推导[...]
。double
是一个函数,所以括号是不必要的,你正在做的是真正调用double 0
和double y
。你应该只使用0.0
作为第一种情况,而在第二种情况下,你不清楚你要转换的是什么。一般来说,最好先做一点设计来决定你的总体策略是什么,因为我不清楚你是否能够根据你当前的工作解析器组合在一起做法。编写解析器有几种众所周知的技术 - 您是否尝试使用特定方法?