统计并打印SML中的匹配值

统计并打印SML中的匹配值,sml,smlnj,Sml,Smlnj,根据赋值的参数,我不能使用模式或折叠,这是一个关于更大问题的特定方法的玩具示例 当我运行代码时,自然会得到一个“0”。所以问题是,我如何得到一个u计数的最终值 fun num_counter(numbers: int list, a_number: int) = let val count = 0 in let fun count_num(numbers: int list, a_count: int) =

根据赋值的参数,我不能使用模式或折叠,这是一个关于更大问题的特定方法的玩具示例

当我运行代码时,自然会得到一个“0”。所以问题是,我如何得到一个u计数的最终值

fun num_counter(numbers: int list, a_number: int) =
     let val count = 0
             in
                 let fun count_num(numbers: int list, a_count: int) =
         if null numbers
         then 0
         else if (hd numbers) = a_number
         then count_num(tl numbers, count + 1)
         else count_num(tl numbers, count)
     in
     count       
     end
     end

您的代码有几个问题:

  • 您的递归函数
    count\u num
    从未被调用
  • 递归通过返回
    0
    而不是结果来终止 到目前为止,您已经累计了(
    a_count
  • 参数
    a_count
    之间存在一些混淆,如 Understand保存
    a_编号
    计数
    在第二行声明
  • 这里有一些修正:

    fun num_计数器(数字:int列表,数字:int)=let
    乐趣计数(数字:整数列表,计数:整数)=
    如果为空数字
    然后计数(*到达列表末尾=>
    返回计算的发生次数*)
    else if(hd编号)=一个_编号
    然后计数(tl数,计数+1)
    else count_num(tl编号、计数)
    在里面
    count_num(number,0)(*count_num的第一次调用,
    计数已初始化为0*)
    结束;
    
    还请注意,您可以使用模式匹配来增强 递归函数:

    fun num_计数器(数字:int列表,数字:int)=
    让乐趣计数\u num([],计数)=计数
    |计数(i::tl,计数)=
    count_num(tl,如果i=a_数,则count+1,否则计数)
    在里面
    计数(数字,0)
    结束;
    
    您可以使用折页将其缩短:

    fun num_counter (numbers, a_number) =
        let fun count (b_number, total) =
                if a_number = b_number
                then total + 1
                else total
        in foldl count 0 numbers
        end
    
    这里
    foldl
    接受三个参数:函数
    count
    在访问每个数字时累积结果,
    numbers
    中的
    b_number
    total
    的初始值为
    0
    和要折叠的数字,
    numbers
    。当
    foldl
    访问了最后一个号码时,它使用
    total
    中的最后一次累积作为结果

    foldl
    本身定义如下:

    或者您可以
    筛选
    并获取成本稍高的
    长度

    fun num_counter (numbers, a_number) =
        length (filter (fn b_number => a_number = b_number) numbers)
    

    这很有效。我还不太清楚什么时候会进入“in”条款。
    fun num_counter (numbers, a_number) =
        length (filter (fn b_number => a_number = b_number) numbers)