LISTのWHILEループ

I need to write a very simple function in SML. It should check if the value 'elem' is greater than any value of the field 'f1' in the list 'L'. The list 'L' contains 3 fields - 'f1','f2','f3'. The function should return 1 if the statement 'elem>f1' is true for any of the members of the list 'L'. Otherwise, the function should return 0. For instance:

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

私はリスト 'L'からフィールド 'f1'を得る方法を知らない。どんなアイデアも高く評価されています。

3
まあ、私はSMLの初心者なので、私は自分の問題を解決する方法は他にありません。しかし、あなたが他の解決策を知っているなら、ここでそれを説明してください。 THX。
追加された 著者 Klausos Klausos,
'elem> f1'という文が 'L'の項目のどれでも真であれば、関数は1を返します。そうでなければ0を返します。
追加された 著者 Klausos Klausos,
whileループを使用している特別な理由はありますか?それは一般的にSMLのひどい考えです。
追加された 著者 jalf,
関数は何を返すべきですか?リストのメンバーが elem> f1 を持たない場合はどうなりますか?
追加された 著者 jalf,

2 答え

SML(および一般的な関数型言語)では、通常、ループのような必須の構造ではなく、再帰に頼っています。

私はSMLで少し錆びますが、ここでは関数を定義する方法の1つです

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;

The function is defined recursively, using pattern matching: The first line says that if the function is called on an empty list, the result is zero. The second line says that if it is called on a list, where the first element is the tuple (f1,f2,f3), then the result is 1 if elem > f1, and otherwise, it's the result of invoking the function recursively on the tail of the list

また、型指定子を省略したことにも注意してください。言語は自動的に型を推定するため、ほとんど必要としません。コンパイラは、あなたが書いたコードでどんな型を安全に使うことができるのかをすでに知っています。だから、引数がどんな型になると思いますか?

2
追加された
ありがとう、私はポイントを得た。
追加された 著者 Klausos Klausos,

ループを使用する代わりに、再帰関数を使用します。 (そして、整数の代わりにブール型の戻り値を使用するほうが意味があります)。

フィールドを抽出する最も簡単な方法は、引数リストのパターンマッチングによるものです。 3つのフィールドがタプルであると仮定すると、次のようになります。

fun check((f1,f2,f3)::L: myList, elem: int)
2
追加された