【问题标题】:WHILE loop for the LISTLIST 的 WHILE 循环
【发布时间】:2012-01-23 05:00:21
【问题描述】:

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

【问题讨论】:

  • 您使用 while 循环的任何特殊原因?这在 SML 中通常是一个糟糕的想法。
  • 好吧,我只是 SML 的新手,因此我不知道如何解决我的问题。但如果您知道其他解决方案,请在此处描述。谢谢。
  • 函数应该返回什么?如果列表中没有成员拥有elem &gt; f1,会发生什么?
  • 如果语句 'elem>f1' 对于 'L' 中的任何条目为真,则函数应返回 1。否则应返回 0。

标签: list while-loop sml


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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 &gt; f1,则结果为1,否则,它是在尾部递归调用函数的结果列表

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

    【讨论】:

      猜你喜欢
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2014-11-02
      • 2011-06-19
      • 1970-01-01
      • 2016-03-14
      • 2016-11-27
      相关资源
      最近更新 更多