Написание кода F # для анализа "2 + 2" в код - PullRequest
4 голосов
/ 28 августа 2011

Чрезвычайно только что начатый вчера новый для 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 Ответ

2 голосов
/ 28 августа 2011

Непосредственная проблема, с которой вы сталкиваетесь, заключается в том, что split - это массив строк. Для доступа к элементу этого массива используется синтаксис split.[x], а не split[x] (который будет применяться split к одноэлементному списку [x], при условии, что это была функция).

Вот еще несколько вопросов:

  1. Ваше определение list, вероятно, неверно: x простирается до длины script, а не длины массива split. Если вы хотите преобразовать массив или другую последовательность в список, вы можете просто использовать List.ofSeq или Seq.toList вместо явного понимания списка [...].
  2. Ваши "приведения" к удвоению немного странные - это неправильный синтаксис для выполнения преобразований в F #, хотя в этом случае это будет работать. double - это функция, поэтому скобки не нужны, и то, что вы делаете, действительно вызывает double 0 и double y. Вы должны просто использовать 0.0 для первого случая, а во втором случае неясно, из чего вы конвертируете.

В общем, вероятно, было бы лучше сделать немного больше дизайна заранее, чтобы решить, какой будет ваша общая стратегия, так как мне не ясно, что вы сможете собрать работающий парсер на основе вашего текущего подход. Есть несколько хорошо известных методов написания парсера - вы пытаетесь использовать определенный подход?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...