Map 在SML中,如何编写';地图';使用类似NumPy的多维阵列广播?

Map 在SML中,如何编写';地图';使用类似NumPy的多维阵列广播?,map,multidimensional-array,numpy,sml,Map,Multidimensional Array,Numpy,Sml,是完整的规则,但作为一个简单的例子,如果a是一个类型为'a list的3D数组,而f是一个类型为'a list->'b的函数,我想要一个函数map',它可以使用f来键入'a list->'b list。对于特定示例,map'将等效于此代码: fun map' fList aListListList = map (fn aListList => map fList aListList) A 当然,除此之外,我希望无论A有多少维度,这个map'都能工作。我在写类型签名时遇到问题,这通常是我做

是完整的规则,但作为一个简单的例子,如果
a
是一个类型为
'a list
的3D数组,而
f
是一个类型为
'a list->'b
的函数,我想要一个函数
map'
,它可以使用
f
来键入
'a list->'b list
。对于特定示例,
map'
将等效于此代码:

fun map' fList aListListList = map (fn aListList => map fList aListList) A
当然,除此之外,我希望无论
A
有多少维度,这个
map'
都能工作。我在写类型签名时遇到问题,这通常是我做错了的标志

编辑:这是一个怎样的解决方法

fun map' levels f A = 
  if levels < 1
  then return f(A)
  else return map' (levels - 1) f A
fun map'级别f A=
如果级别<1
然后返回f(A)
else返回图(级别-1)f A

您在选择正确的类型时遇到问题,因为此函数的正确类型无法在SML的类型系统中表示。不能像这样抽象嵌套列表的嵌套深度。您想要的函数不能简单地用SML表示


您唯一能做的就是为嵌套列表定义自己的类型,然后编写一个函数
map':('a list->'b)->'a nestedlist->'b nestedlist
。但是,正如您所看到的,
nestedlist
的嵌套深度不会在其类型中进行编码,
map'
从其类型中仅剥离一个可见嵌套级别(或由编译器验证)。

您在选择正确的类型时遇到了问题,因为此函数的正确类型不能在SML的类型系统中表示。不能像这样抽象嵌套列表的嵌套深度。您想要的函数不能简单地用SML表示


您唯一能做的就是为嵌套列表定义自己的类型,然后编写一个函数
map':('a list->'b)->'a nestedlist->'b nestedlist
。然而,正如您所看到的,
nestedlist
的嵌套深度不会在其类型中进行编码,
map'
从其类型中(或由编译器验证)正好剥离一个嵌套级别的事实也不会被编码。

啊,我怀疑但不确定。请用户指定他希望递归的级别,您觉得如何?它有点不方便,仍然会中断类型检查,但至少会产生正确的输出。还是有更好的方法来获得所需的行为?@Wang:让用户指定深度似乎不错,但您仍然需要自定义数据类型。还要注意的是,你在编辑中发布的代码将不起作用,因为a)sml中没有return关键字,b)你只调用了f一次,根本没有创建列表。啊,我怀疑,但不确定。请用户指定他希望递归的级别,您觉得如何?它有点不方便,仍然会中断类型检查,但至少会产生正确的输出。还是有更好的方法来获得所需的行为?@Wang:让用户指定深度似乎不错,但您仍然需要自定义数据类型。还请注意,您在编辑中发布的代码将不起作用,因为a)sml中没有return关键字,b)您只调用了f一次,根本没有创建列表。