2011-06-12 61 views
1

Here是完整的規則,但作爲一個簡單的例子,如果A'a list list list類型和f'a list -> 'b類型的功能的3D陣列,我想的函數map'這需要升降機f鍵入'a list list list -> 'b list list。對於具體的例子,map'將相當於該代碼:,如何使用NumPy類廣播爲多維數組編寫'map'?

fun map' fList aListListList = map (fn aListList => map fList aListList) A 

除,當然,我想這map'不管工作有多少尺寸A了。我在編寫類型簽名時遇到了麻煩,這往往表明我做錯了。

編輯:這是一個怎樣的解決方法?

fun map' levels f A = 
    if levels < 1 
    then return f(A) 
    else return map' (levels - 1) f A 

回答

1

您有任何問題想出正確的類型,因爲這個功能的正確類型不能在SML的類型系統來表達。您不能像這樣抽象出嵌套列表的嵌套深度。你想要的功能可以簡單地用SML來表示。

你唯一能做的就是定義你自己的嵌套列表類型,然後編寫一個函數map' : ('a list -> 'b) -> 'a nestedlist -> 'b nestedlist。但是,您可以看到nestedlist的嵌套深度不會按其類型編碼,也不會從map'的類型(或由編譯器驗證)正好剝除一層嵌套可見的事實。

+0

啊,我懷疑但不確定。你認爲如何讓用戶指定他想要遞減多少級別?它稍微不方便,仍然會打破類型檢查,但至少它會產生正確的輸出。還是有更好的方法來獲得所需的行爲? – Wang 2011-06-12 02:52:24

+0

@Wang:讓用戶指定深度看起來不錯,但您仍然需要自定義數據類型。另外請注意,您在編輯中發佈的代碼將無法正常工作,因爲a)sml中沒有返回關鍵字,並且b)您只調用一次f而根本不建立列表。 – sepp2k 2011-06-12 03:07:18