recurse
не имеет регистра для пустого списка, поэтому произойдет сбой при достижении пустого списка.
Давайте исправим это:
fun select (l : int list, f:int -> bool) =
let val newlist : int list = []
fun recurse [] = []
| recurse (x::xs) =
if f(x)
then newlist :: [x] :: recurse(xs)
else
newlist :: recurse(xs)
in
recurse l
end
и протестируем:
- select ([1,2,3,4], fn x => x mod 2 <> 0);
val it = [[],[1],[],[],[3],[]] : int list list
- select ([1], fn x => true);
val it = [[],[1]] : int list list
- select ([1], fn x => false);
val it = [[]] : int list list
Это не хорошо - мы хотим [1,3]
, [1]
и []
.
Тип вашей функции:
val select = fn : int list * (int -> bool) -> int list list
Результат int list list
неверен;это должно быть int list
.
Это происходит потому, что первый элемент результата из recurse
является int list
- пустым newlist
- поэтому результат должен быть int list list
.
Исправление проблемы дает
fun select (l : int list, f:int -> bool) =
let fun recurse [] = []
| recurse (x::xs) =
if f x
then x :: recurse xs
else recurse xs
in
recurse l
end
Обратите внимание, что ограничения типа довольно бессмысленны;если вы удалите их, вы получите гораздо более полезную полиморфную функцию.