我需要在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'。任何想法都非常感激。
答案 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,否则,它是递归调用函数的结果列表的尾部
另请注意,我省略了类型说明符。您很少需要它们,因为语言会自动推断出类型。编译器已经知道哪些类型可以安全地与您编写的代码一起使用,那么为什么还要告诉它您认为参数将是什么类型?