WHILE петля для СПИСКА - PullRequest
       11

WHILE петля для СПИСКА

3 голосов
/ 19 декабря 2011

Мне нужно написать очень простую функцию на SML.Следует проверить, больше ли значение «elem», чем любое значение поля «f1» в списке «L».Список «L» содержит 3 поля - «f1», «f2», «f3».Функция должна вернуть 1, если утверждение 'elem> f1' истинно для любого из членов списка 'L'.В противном случае функция должна вернуть 0. Например:

L = 
f1 f2 f3
1  4  6
2  1  2
3  4  8
8  5  9

elem = 3

fun check(L: myList, elem: int): int =
let
  val counter = ref 0
  val counter_end = length L
in
       while (!counter <= counter_end) do
            let val f1 = List.nth(L,counter) 
            in
               if elem > f1 then 1 else 0
            end
            counter := !counter + 1 
end

Я не знаю, как получить поле 'f1' из списка 'L'.Любые идеи высоко ценятся.

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

В 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, а в противном случае это результат рекурсивного вызова функции в хвосте список

Также обратите внимание, что я опустил спецификаторы типа. Они вам редко нужны, потому что язык выводит типы автоматически. Компилятор уже знает, какие типы можно безопасно использовать с кодом, который вы написали, так зачем беспокоиться о том, какие типы, по вашему мнению, будут в качестве аргументов?

2 голосов
/ 19 декабря 2011

Используйте рекурсивную функцию вместо использования цикла.(И, вероятно, было бы более разумно использовать логическое возвращение вместо целого числа.)

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

fun check((f1,f2,f3)::L: myList, elem: int)
...