В SML (и функциональных языках в целом) вы обычно будете полагаться на рекурсию, а не на императивные конструкции, такие как циклы.
Я немного заржавел в SML, но вот один из способов определить функцию
fun check elem [] = 0
| check elem ((f1,f2,f3)::tl) = if elem > f1 then 1 else check elem tl;
Тогда его можно назвать так:
(* define a list to scan *)
val L = [(1,4,6),(2,1,2),(3,4,8),(8,5,9)];
(* call the function on our list *)
check 3 L;
Функция определяется рекурсивно с использованием сопоставления с образцом: первая строка говорит, что если функция вызывается в пустом списке, результат равен нулю.
Вторая строка говорит, что если он вызывается в списке, где первый элемент является кортежем (f1,f2,f3)
, то результатом будет 1, если elem > f1
, а в противном случае это результат рекурсивного вызова функции в хвосте список
Также обратите внимание, что я опустил спецификаторы типа. Они вам редко нужны, потому что язык выводит типы автоматически. Компилятор уже знает, какие типы можно безопасно использовать с кодом, который вы написали, так зачем беспокоиться о том, какие типы, по вашему мнению, будут в качестве аргументов?