Реализация «Pythonic» карты в Scheme: плохая идея? - PullRequest
5 голосов
/ 21 мая 2011

В схеме функция (map fn list0 [list1 .. listN]) поставляется с ограничением на то, что списки должны иметь одинаковое количество элементов. Исходя из Python, мне не хватает свободы в понимании списков Python, которые выглядят как map выше, но без этого ограничения.

Я испытываю желание реализовать альтернативную «my-map», которая допускает списки разного размера, перебирая первые N элементов всех списков, где N - длина самого короткого списка.

Например, пусть num будет 10, а lst будет (1 2 3). С my-map я надеюсь написать такие выражения, как:

(my-map + (circular-list num) lst)))

И получите:

(11 12 13)

Мне легче читать это, чем обычные

(map + (lambda (arg) (+ num arg)) lst)

или

(map + (make-list (length lst) num) lst) 

Два вопроса:

  • Как новичок в Схеме, я упустил из виду важные причины ограничения на `map`?
  • Существует ли что-то вроде `my-map` в Схеме или в SRFI? Я взглянул на srfi-42, но либо это не то, что я ищу, либо это было так, и это не было очевидно.

1 Ответ

7 голосов
/ 21 мая 2011

Во-первых, обратите внимание, что map разрешает разрешать пустые списки, но, конечно, если есть один пустой список, то все они должны быть пустыми.

Во-вторых, посмотрите на srfi-1 версия map - она ​​особенно отличается от версии R5RS следующим образом:

Эта процедура расширена от ее спецификации R5RS, чтобы позволить аргументам бытьнеодинаковой длины;он заканчивается, когда заканчивается самый короткий список.

В-третьих, большинство программистов Scheme очень бы предпочли

(map (lambda (arg) (+ num arg)) lst)

Я предполагаю, что Scheme отличается от Python тем, что делаетlambda выражения становятся все более читабельными, когда вы привыкаете к языку.

И, наконец, есть некоторые реализации, которые поставляются с некоторой формой понимания списка.Например, в Racket вы можете написать:

(for/list ([arg lst]) (+ num arg))
...