SML - 使用地图 return 组合结果
SML - Using map to return combined results
我有这些功能:
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,以及 returns 包含 ts 中的那些元素的列表,这些元素不能被 ts2.
中的任何元素整除
例如IsDivisibleMap([10,11,12,13,14],[3,5,7]) 应该 return [11,13].
我现在的方式是 return 列表列表,其中每个列表是 ts2
中每个数字的结果
例如IsDivisibleMap([10,11,12,13,14],[3,5,7]) 是 returning [10,11,13,14][11,12,13,14][10, 11,12,13]
我怎样才能 return 我正在寻找的结果,同时仍然尽可能使用地图和过滤器?
这里的术语存在各种问题;我想首先解决这些问题。
首先,名字IsDivisibleMap
不是一个好名字有两个原因:
- 根据函数的描述,它是一个过滤器,而不是地图。也就是说,给定一个输入列表,它会从该列表中删除不满足谓词的元素。
- 此函数生成的元素不可分割第二个输入的所有元素。
基于这些考虑,我想改为调用函数 IsIndivisibleFilter
。我还将名称 IsDivisible
更改为 IsIndivisible
。
其次,在您对函数的描述中,您说它应该 return 一个列表,其中包含 ts
中不能被 any 分割的那些元素ts2
中的元素。但是,我认为你的意思是:"return a list containing those elements of ts
that are indivisible by all elements in 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
我有这些功能:
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,以及 returns 包含 ts 中的那些元素的列表,这些元素不能被 ts2.
中的任何元素整除例如IsDivisibleMap([10,11,12,13,14],[3,5,7]) 应该 return [11,13].
我现在的方式是 return 列表列表,其中每个列表是 ts2
中每个数字的结果例如IsDivisibleMap([10,11,12,13,14],[3,5,7]) 是 returning [10,11,13,14][11,12,13,14][10, 11,12,13]
我怎样才能 return 我正在寻找的结果,同时仍然尽可能使用地图和过滤器?
这里的术语存在各种问题;我想首先解决这些问题。
首先,名字IsDivisibleMap
不是一个好名字有两个原因:
- 根据函数的描述,它是一个过滤器,而不是地图。也就是说,给定一个输入列表,它会从该列表中删除不满足谓词的元素。
- 此函数生成的元素不可分割第二个输入的所有元素。
基于这些考虑,我想改为调用函数 IsIndivisibleFilter
。我还将名称 IsDivisible
更改为 IsIndivisible
。
其次,在您对函数的描述中,您说它应该 return 一个列表,其中包含 ts
中不能被 any 分割的那些元素ts2
中的元素。但是,我认为你的意思是:"return a list containing those elements of ts
that are indivisible by all elements in 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