number_in_month упражнение

Я новичок в SML и делаю домашнее задание. «Напишите функцию number_in_month, которая принимает список дат и месяц (т. Е. Целое число) и возвращает количество дат в списке в данном месяце».

Это то, что я разработал, и не вижу в этом ничего плохого. Пожалуйста помоги.

`

    fun number_in_month (dates: (int*int*int) list,month:int) = 
    if ((#2 (hd dates)) = month)
    then val flag=1 flag+number_in_month(tl dates, month) 
    else number_in_month((tl dates),month)`

REPL сообщает, что: замена VAL на EQUALOP.


person Xiong Xiong    schedule 18.01.2013    source источник


Ответы (4)


Вы не можете привязать переменные «таким образом». Связывание переменной - это объявление, и поэтому не может быть выполнено там, где ожидается выражение.

В этом случае вы должны использовать выражение let-in-end

fun foo x = 
  let 
    val a = 42 
  in 
    a*x
  end 
person Jesper.Reenberg    schedule 19.01.2013

Ваша проблема - бесконечная рекурсия. Компилятор не может выйти из него, потому что независимо от результата, если ... тогда ... иначе вы снова запускаете свою функцию. Попробуйте следующее:

fun number_in_month (dates: (int*int*int) list,month:int) = 
    if null dates
    then 0
    else if ((#2 (hd dates)) = month)
    then val flag=1 flag+number_in_month(tl dates, month) 
    else number_in_month((tl dates),month)
person setrul    schedule 23.01.2013

Я попытался исправить это сам, и это было моим решением:

fun number_in_month (dias: (int * int * int) list, mes: int) = if null dias then 0 else if ((# 2 (hd dias)) = mes) тогда пусть val flag = 1 + number_in_month (tl dias, mes) в конце флага else number_in_month ((tl dias), mes)

Надеюсь, ты тоже сможешь им воспользоваться!

person Isko    schedule 24.01.2013

Сообщение об ошибке от REPL сбивает с толку, но Джеспер прав в том, что вы должны использовать выражение let-in-end, если вам нужен оператор присваивания в функциях. Это обязательно поможет вам устранить эту ошибку.

person vikramsjn    schedule 19.01.2013