Ваша функция promedio
не работает на пустом входе;promedio []
, так как он пытается разделить на ноль.
Вот два альтернативных способа написать это, которые принимают во внимание пустые списки:
(* Using one traversal *)
fun average xs =
case foldl (fn (x, (sum, count)) => (x + sum, 1 + count)) (0, 0) xs of
(0, 0) => 0
| (x, y) => x div y
(* Using two traversals *)
val sum = foldl op+ 0
fun average [] = 0
| average xs = (sum xs) div (length xs)
Вы можете раздел список, использующий любой предикат с List.partition
.
В вашем случае предикат может быть x <= avg
.
fun partition_average xs =
let val avg = average xs
in List.partition (fn x => x <= avg) xs end
Обратите внимание, что если я не связал average xs
сavg
за пределами fn x => ...
,
(* Don't do this *)
fun partition_average xs =
List.partition (fn x => x <= average xs) xs
, тогда я буду пересчитывать average xs
для каждого элемента xs
.
Демо:
- partition_average [1,2,3,4,5]; (* avg being 3 *)
> val it = ([1, 2, 3], [4, 5]) : int list * int list
- partition_average [1,2,3,9]; (* avg being 3(.75) *)
> val it = ([1, 2, 3], [9]) : int list * int list