2017-09-04 54 views
0

我有以下功能:SML - 使用地圖返回合併後的結果

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中的任何元素都不可分割的。

E.g. 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 ]

如何儘可能返回我正在查找的結果,同時仍然使用映射和過濾器?

回答

3

這裏有各種各樣的問題與術語;我想先解決這些問題。

首先,這個名字IsDivisibleMap是不是有兩個原因一個好聽的名字:根據功能的描述

  1. ,它是一個過濾,而不是地圖。也就是說,給定一個輸入列表,它將從列表中刪除不滿足謂詞的元素。
  2. 該函數產生的元素是不可分割的第二個輸入的所有元素。

基於這些考慮,我想調用函數IsIndivisibleFilter來代替。我也將名稱IsDivisible更改爲IsIndivisible

其次,在功能的描述,你說,它應該返回一個包含有由ts2任何元素不可分割的ts這些元素的列表。不過,我覺得你的意思是:


「的所有元素ts2返回一個包含不可分割的ts這些元素的列表」現在,回的主要問題。對於ts的每個元素,我們需要檢查它是否由ts2的所有元素都不可分割。有一個很好的函數叫做List.all,它檢查一個列表的所有元素是否滿足某個謂詞。因此,要檢查tts特定的元素,我們可以這樣做:

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 
+1

太棒了! List.all正是我所需要的。謝謝。 –