SML-使用map返回组合结果

SML-使用map返回组合结果,sml,smlnj,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-获取两个i

我有以下职能:

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-获取两个int、ts和ts2列表,并返回一个包含ts元素的列表,这些ts元素不可被ts2中的任何元素分割

例如,IsDivisible映射([10,11,12,13,14],[3,5,7])应该返回[11,13]

我现在使用的方法是返回一个列表列表,其中每个列表都是ts2中每个数字的结果

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


在仍然尽可能使用map和filter的情况下,如何返回我正在查找的结果?

术语方面存在各种问题;我想首先谈谈这些问题

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

  • 根据对函数的描述,它是一个过滤器,而不是映射。也就是说,给定一个输入列表,它将从该列表中删除不满足谓词的元素
  • 此函数产生的元素是第二个输入的所有元素所不可分割的
  • 基于这些考虑,我想调用函数
    IsIndivisibleFilter
    。我还将名称
    IsDivisible
    更改为
    IsIndivisible

    其次,在您对函数的描述中,您说它应该返回一个列表,其中包含
    ts
    的那些元素,这些元素是
    ts2
    中的任何元素所不可分割的。但是,我认为您的意思是:“返回一个列表,其中包含
    ts
    的那些元素,这些元素是
    ts2
    中所有元素不可分割的。”


    现在,回到主要问题。对于
    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
    

    这里有各种各样的术语问题;我想首先谈谈这些问题

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

  • 根据对函数的描述,它是一个过滤器,而不是映射。也就是说,给定一个输入列表,它会从不满足谓词的列表中删除元素
  • 此函数产生的元素是第二个输入的所有元素所不可分割的
  • 基于这些考虑,我想调用函数
    IsIndivisibleFilter
    。我还将名称
    IsDivisible
    更改为
    IsIndivisible

    其次,在您对函数的描述中,您说它应该返回一个列表,其中包含
    ts
    的那些元素,这些元素是
    ts2
    中的任何元素所不可分割的。但是,我认为您的意思是:“返回一个列表,其中包含
    ts
    的那些元素,这些元素是
    ts2
    中所有元素不可分割的。”


    现在,回到主要问题。对于
    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
    

    好极了这正是我所需要的。谢谢,太棒了!这正是我所需要的。非常感谢。