Вставка ошибки 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, который может быть полезен для других, обратитесь к этому разделу:

Некоторые вопросы все еще не по теме, даже если они вписываются в одну из категорий, перечисленных выше:

  • Вопросы, требующие помощи в отладке ("почему этот код не работает?") Должны включать желаемое поведение, конкретную проблему или ошибку и самый короткий код, необходимый для его воспроизведения в самом вопросе. Вопросы без четкой постановки проблемы бесполезны для других читателей. См.: Как создать минимальный, полный и проверяемый пример.

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

  1. Вырезать линии, пока не дойдете до этой точки:

    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"
    

    выдаст такую ​​же ошибку.

  2. Возможно, вам лучше с 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.
    
Другие вопросы по тегам