我有这些功能:
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] ]
如何在尽可能使用地图和过滤器的情况下返回我要查找的结果?
答案 0 :(得分:3)
术语存在各种问题;我想从解决这些问题开始。
首先,名称IsDivisibleMap
不是一个好名字,原因有两个:
基于这些注意事项,我想改为调用函数IsIndivisibleFilter
。我还会将名称IsDivisible
更改为IsIndivisible
。
其次,在您对该函数的描述中,您应该返回一个列表,其中包含ts
中ts2
中任何元素不可分割的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