2011-06-12 59 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