用于LIST的WHILE循环

时间:2011-12-18 21:33:04

标签: list while-loop sml

我需要在SML中编写一个非常简单的函数。它应该检查值'elem'是否大于列表'L'中字段'f1'的任何值。列表'L'包含3个字段 - 'f1','f2','f3'。如果对于列表“L”的任何成员,语句“elem> f1”为真,则该函数应返回1。否则,该函数应返回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

我不知道如何从列表'L'获取字段'f1'。任何想法都非常感激。

2 个答案:

答案 0 :(得分:2)

使用递归函数而不是使用循环。 (使用布尔返回而不是整数可能更有意义。)

提取字段的最简单方法是通过参数列表中的模式匹配。假设你的三个字段是一个元组,如下所示:

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

答案 1 :(得分:2)

在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),那么如果elem > f1则结果为1,否则,它是递归调用函数的结果列表的尾部

另请注意,我省略了类型说明符。您很少需要它们,因为语言会自动推断出类型。编译器已经知道哪些类型可以安全地与您编写的代码一起使用,那么为什么还要告诉它您认为参数将是什么类型?