в SML, как написать 'map' с NumPy-подобным вещанием для многомерных массивов? - PullRequest
1 голос
/ 12 июня 2011

Здесь - полные правила, но в качестве быстрого примера, если A - это трехмерный массив с типом 'a list list list и f функцией с типом 'a list -> 'b, я бы хотел функция map', которая принимает лифты f для ввода 'a list list list -> 'b list list. Для конкретного примера map' будет эквивалентен этому коду:

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

За исключением, конечно, я бы хотел, чтобы этот map' работал независимо от того, сколько измерений было A. У меня проблемы с написанием сигнатуры типа, что часто является признаком того, что я делаю это неправильно.

edit : Как это можно обойти?

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

1 Ответ

1 голос
/ 12 июня 2011

У вас возникают проблемы при выборе правильного типа, потому что правильный тип для этой функции не может быть выражен в системе типов SML. Вы не можете абстрагироваться от глубины вложенности вложенного списка, как это. Функция, которую вы хотите, просто не может быть выражена в SML.

Единственное, что вы можете сделать, это определить свой собственный тип для вложенных списков, а затем написать функцию map' : ('a list -> 'b) -> 'a nestedlist -> 'b nestedlist. Однако, как вы можете видеть, глубина вложенности nestedlist не будет закодирована в его типе, а также тот факт, что map' удаляет ровно один уровень вложенности, видимый из его типа (или проверяется компилятором).

...