【问题标题】:SML - Using map to return combined resultsSML - 使用地图返回组合结果
【发布时间】:2017-09-05 05:38:20
【问题描述】:

我有这些功能:

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 - 获取两个整数列表,tsts2,并返回一个包含 ts 不能被 ts2 中的任何元素整除。

例如IsDivisibleMap([10,11,12,13,14],[3,5,7]) 应该返回 [11,13]。

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

中每个数字的结果

例如IsDivisibleMap([10,11,12,13,14],[3,5,7]) 正在返回 [10,11,13,14][11,12,13,14][10,11,12,13 ]

如何在尽可能使用地图和过滤器的同时返回我正在寻找的结果?

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    这里的术语存在各种问题;我想先解决这些问题。

    首先,IsDivisibleMap 这个名字不是个好名字,原因有二:

    1. 根据函数的描述,它是一个filter,而不是一个map。也就是说,给定一个输入列表,它会从该列表中删除不满足谓词的元素。
    2. 此函数生成的元素不可分割第二个输入的所有元素。

    基于这些考虑,我想改为调用函数IsIndivisibleFilter。我也会把名字IsDivisible改成IsIndivisible

    其次,在你对函数的描述中,你说它应该返回一个列表,其中包含ts 中那些不能被ts2 中的any 元素整除的元素。但是,我认为您的意思是:“返回一个列表,其中包含 ts 中的那些元素,这些元素不能被 ts2 中的 all 元素整除”


    现在,回到主要问题。对于ts 的每个元素,我们需要检查它是否不能被ts2 的所有元素整除。有一个很好的函数叫做List.all,它检查列表的所有元素是否满足某个谓词。因此,要检查 ts 的特定元素 t,我们可以这样做:

    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
    

    【讨论】:

    • 太棒了! List.all 正是我所需要的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2012-04-10
    • 2016-10-26
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多