Вставка ошибки LPAREN в SML
Я пишу код SML, чтобы рассчитать количество живых людей, мертвых людей и зомби с течением времени по заданным формулам. Я поместил свой код в файл ".sml" и открыл его в SMLNJ. Я получаю следующие ошибки.
zombies.sml:36.3 Error: syntax error: inserting LPAREN
zombies.sml:43.1 Error: syntax error found at EOF
А вот и мой код.
val living = 500000.0;
val zombie = 0.0;
val dead = 1.0;
val counter = 0.0;
val d_ = 0.0001; (*chance of natural death*)
val z_ = 0.0001; (*chance of zombification after death*)
val b_ = 0.0095; (*chance of zombie attack*)
val a_ = 0.005; (*chance of a zombie dying?*)
val birth_rate = 1.0;
(*calculates amount of living*)
fun S(living:real, birth_rate:real, b_:real, zombie:real, d_:real) = birth_rate - b_*living*zombie - d_*living;
(*calculates amount of zombies*)
fun Z(zombie:real, b_:real, living:real, z_:real, dead:real, a_:real) = b_*living*zombie + z_*dead - a_*living*zombie;
(*calculates amount of dead*)
fun R(dead:real, d_:real, living:real, a_:real, zombie:real) = d_*living + a_*living*zombie - zombie*dead;
fun program (living:real, zombie:real, dead:real, birth_rate:real, b_:real, z_:real, d_:real, a_:real, counter:real) =
= if counter = 0 then 1
= else (S(living, birth_rate, b_, zombie, d_);
Z(zombie, b_, living, z_, dead, a_);
R(dead, d_, living, a_, zombie);
counter = (counter + 1);
program(living, zombie, dead, birth_rate, b_, z_, d_, a_, counter));
program(living, zombie, dead, birth_rate, b_, z_, d_, a_, counter);
Финал, рабочая редакция. Функциональные языки странные.
fun add(x, y) = x + y;
(*calculates amount of living*)
fun S(living, birth_rate, b_, zombie, d_) =
round(real(birth_rate+living) - b_*real(living)*real(zombie) - d_*real(living));
(*calculates amount of zombies*)
fun Z(zombie, b_, living, z_, dead, a_) =
round(b_*real(living)*real(zombie) + z_*real(dead) - a_*real(living)*real(zombie));
(*calculates amount of dead*)
fun R(dead, d_, living, a_, zombie) =
round(d_*real(living) + a_*real(living)*real(zombie) - real(zombie*dead));
fun main (living) =
let
val living = ref living;
val zombie = ref 1;
val dead = ref 1;
val birth_rate = 1;
val d_ = 0.0001; (*chance of natural death*)
val z_ = 0.0001; (*chance of zombification after death*)
val b_ = 0.0095; (*chance of zombie attack*)
val a_ = 0.005; (*chance of a zombie dying?*)
val count = ref 1;
in
while (!count < 10) do
(
living := S(!living, birth_rate, b_, !zombie, d_);
print("Living count: " ^ Int.toString(!living) ^ "\n");
zombie := Z(!zombie, b_, !living, z_, !dead, a_);
print("Zombie count: " ^ Int.toString(!zombie) ^ "\n");
dead := R(!dead, d_, !living, a_, !zombie);
print("Dead count: " ^ Int.toString(!dead) ^ "\n");
count := !count + 1;
print(Int.toString(!count) ^ "\n")
)
end;
2 ответа
Те =
в начале строки явно фальшивые
fun program (…) =
= if counter = 0 then 1
= else (S(living, birth_rate, b_, zombie, d_);
Может быть, файл был поврежден при передаче? (=
используется в качестве символа продолжения строки в MIME, но он будет расположен в конце строки.)
Кроме того, целые числа и числа с плавающей точкой являются разными типами в ML. (Это относится и к литералам.) Вы должны решить, стоит ли counter
а также birth_rate
целые или действительные числа.
Линия
counter = (counter + 1);
не имеет никакого эффекта. Переменные неизменны в SML. Вам нужно вместо этого использовать привязку let или просто вызвать program
непосредственно с увеличенным значением счетчика.
Чтобы задать вопрос о Stackru, который может быть полезен для других, обратитесь к этому разделу:
Некоторые вопросы все еще не по теме, даже если они вписываются в одну из категорий, перечисленных выше:
- Вопросы, требующие помощи в отладке ("почему этот код не работает?") Должны включать желаемое поведение, конкретную проблему или ошибку и самый короткий код, необходимый для его воспроизведения в самом вопросе. Вопросы без четкой постановки проблемы бесполезны для других читателей. См.: Как создать минимальный, полный и проверяемый пример.
В своем примере вы уже определили, что проблема в последней части вашего кода, но поскольку последняя часть зависит от первой части, вы не можете просто опубликовать последнюю часть, так как в противном случае проблема не может быть воспроизведенный. Но синтаксические ошибки могут.
Вырезать линии, пока не дойдете до этой точки:
fun program (living:real, zombie:real, dead:real, birth_rate:real, b_:real, z_:real, d_:real, a_:real, counter:real) = = if counter = 0 then 1 = else raise Fail "Not relevant"
выдаст такую же ошибку.
Возможно, вам лучше с REPL, который дает лучшие сообщения об ошибках, чем SML/NJ.
Сравните, например, вывод SML/NJ:
typo.sml:24.3 Error: syntax error: inserting LPAREN typo.sml:33.1 Error: syntax error found at EOF /usr/lib/smlnj/bin/sml: Fatal error -- Uncaught exception Compile with "syntax error" raised at ../compiler/Parse/main/smlfile.sml:15.24-15.46
с этим по московскому ОД:
File "typo.sml", line 24, characters 2-4: ! = if counter = 0 then 1 ! ^^ ! Syntax error.