【问题标题】:Multiple input types with fold带折叠的多种输入类型
【发布时间】:2016-05-17 20:36:52
【问题描述】:

我试图弄清楚如何在不同类型的输入上实现折叠函数。作为示例,我将对列表使用 count 函数(不过,我有多个函数可以实现)。 假设一个 int 列表输入(这应该适用于任何类型的列表,不过),我的计数函数将是

val count = foldr (fn(x:int,y)=>y+1) 0 ;
val count = fn : int list -> int

但是,我正在尝试在类型为

的情况下创建计数函数
val count = fn : int list * bool list -> int

其中 int 列表是集合的全域,布尔值确定全域的哪些值在集合中。即,(1,3,5,6),(true,false,false,true) 产生最后一组 (1,6),计数为 2。我首先想到的是某种形式的

val count= foldr (fn(x:(int*bool),y)=>if #2x then y+1 else y ) 0 ;

但这会导致返回类型为

val count = fn : (int * bool) list -> int

这不是我所需要的。从逻辑上讲,它们是相似的,但我希望将这两种类型组合在一起,分别放在一个列表中。

【问题讨论】:

    标签: sml fold ml


    【解决方案1】:
    1. 你可以使用ListPair.foldl:

      fun count (xs, bs) = ListPair.foldl (fn (x, b, acc) => ...) ... (xs, bs)
      

      其中第一个...xbacc 的某种组合,第二个... 是初始值。

      这假定xsbs 的长度相同,如果不是,则丢弃较长列表中的剩余元素。 (您可能应该尝试证明这是否在xsbs 更长的情况下给出了正确答案。)

    2. 否则,您需要通过创建一个组合两个列表的函数,将您的 int list × bool list 组合(也称为 zip)到一个 (int × bool) 列表,并将此功能与您已经在做的折叠结合使用。

      fun combine (x::xs, y::ys) = ...
        | combine (..., ...) = ...
      

      这个函数可以等价于ListPair.zip

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 2023-03-18
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多