Если у меня есть этот код:
fun coord_select (x : int, cs : (int*int) list) =
List.filter (fn (first, _) => first = x ) cs
тестирование с вводом дает это:
coord_select (2, [(2,2),(2,3),(3,3),(4,3)])
: val it = [(2,2),(2,3)] : (int * int) list
Теперь, что если я не дам желаемую первую координату как * 1007?* но как список нескольких необходимых первых координат, таких как [3,4], т.е. я хочу, чтобы все кортежи координат начинались с 3, а также с 4?Самый простой способ - создать рекурсивную оболочку, которая прошла бы по списку и включила значение в качестве первой переменной coord_select
.Но я бы хотел понять вложенные вещи лучше, чем такая грубая сила.Итак, я придумал это:
fun coord_match (fs : int list, cs :(int*int) list) =
map (coord_select (f, cs)) fs
, но это не может действительно работать, потому что, как было отмечено, coord_select
в map
на самом деле пытается вернуть список - и какmap
знаете, как подключить членов fs
к f
?Common Lisp действительно имеет устройство для предотвращения запуска подобных функций, то есть оператор '
.Но это опять-таки не поможет, потому что map
не знает, какая переменная fs
предоставляет.Для ввода, например, у меня есть эти координаты:
[(2,2),(2,3),(3,3),(4,3)]
, и у меня есть этот список x-координат для сравнения с приведенным выше списком
[3,4]
Опять же, я мог бы просто поставитьрекурсивная обертка вокруг этого, но я стремлюсь к более элегантному вложенному решению из большого семейства fold
.