month_range
入力として 1 年の 2 日 (たとえば、1 年が 365 日であると仮定すると 65 と 128) を取り、day1 から day2 までの日が属する月の番号のリストを返すという名前の関数があります。
リストのサイズは「day2 - day1 + 1」でなければなりません。
例: month_range(25,35) は次を返す必要があります: [1,1,1,1,1,1,1,2,2,2,2]
次のコードを書きました
fun month_range (day1:int,day2:int) =
let
val month_days= [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
fun what_month(day :int) =
let
fun aux(sum :int, numbers: int list) =
let
val numbers_tail = tl numbers
in
if sum <= (hd numbers)
then 1
else
1 + aux(sum, (hd numbers + hd numbers_tail)
:: (tl numbers_tail))
end
in
aux(day, month_days)
end
in
if (day1>day2)
then []
else what_month(day1) @ what_month(day1 + 1)@::what_month(day2)
end
しかし、それは私に次のエラーを与えます
/tmp/emacs-region5156f3r:21.51-21.54 Error: unbound variable or constructor: @::
/tmp/emacs-region5156f3r:21.12-21.70 Error: operator is not a function [literal]
operator: int
in expression:
(what_month (day1 + 1)) <errorvar>
/tmp/emacs-region5156f3r:21.12-21.70 Error: operator and operand don't agree [literal]
operator domain: 'Z list * 'Z list
operand: int * _
in expression:
what_month day1 @ (((what_month <exp>) <errorvar>) what_month) day2
uncaught exception Error
raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27
../compiler/TopLevel/interact/evalloop.sml:44.55
../compiler/TopLevel/interact/evalloop.sml:296.17-296.20