编写F#代码将“2 + 2”解析为代码

时间:2011-08-28 15:44:26

标签: f#

非常刚刚开始 - 昨天新来的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 

感谢。

1 个答案:

答案 0 :(得分:2)

您遇到的直接问题是split是一个字符串数组。要访问此数组的元素,语法为split.[x],而不是split[x](将split应用于单例列表[x],假设它是一个函数。)< / p>

以下是其他一些问题:

  1. 您对list的定义可能不对:x的范围最长为script,而不是数组split的长度。如果要将数组或其他序列转换为列表,可以使用List.ofSeqSeq.toList而不是显式列表推导[...]
  2. 你的“强制转换”加倍有点奇怪 - 这不是在F#中执行转换的正确语法,尽管在这种情况下它会起作用。 double是一个函数,所以括号是不必要的,你正在做的是真正调用double 0double y。你应该只使用0.0作为第一种情况,而在第二种情况下,你不清楚你要转换的是什么。
  3. 一般来说,最好先做一点设计来决定你的总体策略是什么,因为我不清楚你是否能够根据你当前的工作解析器组合在一起做法。编写解析器有几种众所周知的技术 - 您是否尝试使用特定方法?