SML - 使用map返回组合结果

时间:2017-09-04 17:09:00

标签: sml smlnj

我有这些功能:

fun IsDivisible(t, t2) = if t mod t2 > 0 then true else false;

fun IsDivisibleFilter(ts, t) = List.filter(fn x => IsDivisible(x, t)) ts;

fun IsDivisibleMap(ts, ts2) = map(fn x => IsDivisibleFilter(ts, x)) ts2;

IsDivisibleMap - 获取两个整数列表, ts ts2 ,并返回包含 ts <元素的列表/ em> ts2 中的任何元素都不可分割。

E.g。 IsDivisibleMap([10,11,12,13,14],[3,5,7])应该返回[11,13]。

我现在拥有它的方式是返回一个列表列表,其中每个列表是 ts2

中每个数字的结果

E.g。 IsDivisibleMap([10,11,12,13,14],[3,5,7])正在返回[10,11,13,14] [11,12,13,14] [10,11,12,13] ]

如何在尽可能使用地图和过滤器的情况下返回我要查找的结果?

1 个答案:

答案 0 :(得分:3)

术语存在各种问题;我想从解决这些问题开始。

首先,名称IsDivisibleMap不是一个好名字,原因有两个:

  1. 根据功能描述,它是过滤器,而不是地图。也就是说,给定一个输入列表,它会从该列表中删除不满足谓词的元素。
  2. 此功能产生的元素由第二个输入的所有元素不可分割
  3. 基于这些注意事项,我想改为调用函数IsIndivisibleFilter。我还会将名称IsDivisible更改为IsIndivisible

    其次,在您对该函数的描述中,您应该返回一个列表,其中包含tsts2任何元素不可分割的ts元素。但是,我认为你的意思是:&#34;返回一个包含ts2元素的列表,这些元素与ts&#34;中的所有元素不可分割。

    现在,回到主要问题。对于ts2的每个元素,我们需要检查List.all的所有元素是否不可分割。有一个很好的函数叫t,它检查列表的所有元素是否满足某个谓词。因此,要检查ts的特定元素fun IsIndivisibleByAll (t, ts2) = List.all (fn t2 => IsIndivisible (t, t2)) ts2 ,我们可以执行以下操作:

    fun IsIndivisibleFilter (ts, ts2) =
      List.filter (fn t => IsIndivisibleByAll (t, ts2)) ts
    

    现在我们可以通过根据这个谓词进行过滤来实现原始函数:

    fun IsIndivisible t t2 = (t mod t2 > 0)
    fun IsIndivisibleByAll ts2 t = List.all (IsIndivisible t) ts2
    fun IsIndivisibleFilter (ts, ts2) = List.filter (IsIndivisibleByAll ts2) ts
    

    最后,我想提一下,你可以通过适当的currying来清理这个实现。以下是我将如何实现它:

    this