了解Scheme中n个列表上的n元操作的映射模式

时间:2018-10-21 02:53:21

标签: scheme higher-order-functions map-function

我知道通过将函数(map f '(a b c d))应用于列表中的每个元素,'(f(a) f(b) f(c) f(d))f。但是以下内容对我来说似乎很难理解:

(map * '(1 2) '(1 2))

输出应为'(1 4)。怎么会来?

当我们对 n 列表应用 n 元运算时,谁能解释map模式在Scheme中的工作原理?

3 个答案:

答案 0 :(得分:0)

map接受所提供列表的第i个元素,将它们传递给n元运算,并将结果存储在返回列表的第i个位置。

因此,(map f '(a b c d) '(A B C D))等于((f a A) (f b B) (f c C) (f d D))。 超过两个列表的处理方式相似。

答案 1 :(得分:0)

'(f (a) f (b) f (c) f (d))是且只能在评估后成为(f (a) f (b) f (c) f (d))

可以这样定义一个列表参数的

map

(define (map1 fn lst)
  (if (null? lst)
      '()
      (cons (fn (car lst))
            (map1 fn (cdr lst)))))

(map add1 '(1 2 3))可以替换为

(cons (add1 '1) 
      (cons (add1 '2)
            (cons (add1 '3)
                  '())))
; ==> (2 . (3 . (4 . ())))
; ==> (2 3 4)

现在map至少接受一个列表参数,并且期望传递的函数接受一个或每个参数。因此(map * '(1 2) '(1 2))与以下内容相同:

(cons (* '1 '1)
      (cons (* '2 '2)
            '()))
; ==> (1 . (4 . ())) 
; ==> (1 4)

我不确定您是否在掌握map或列表编制方式时遇到问题。如果是后者,则应该真正优先考虑能够看到(1 2 (3 4))并了解3caaddr,因为这对是(1 . (2 . ((3 . (4 . ())) . ())))。在看对时,从右到左阅读它,您会看到它。如果是map,则需要实现它们。这是学习它的最好方法。

答案 2 :(得分:0)

真正理解某事最好是自己实现。

具有1个参数的函数的映射很简单,

  defaultLatLong = {
    lat: 45.4667971, 
    lng: 9.1904984
  };

  var map = new google.maps.Map(document.getElementById('map-canvas_1'), {
    center: defaultLatLong,
    zoom: 2,
    mapTypeId: 'roadmap',
    disableDefaultUI: true,
    zoomControl: true
  });

  var input = document.getElementById('location-text-box');

  var autocomplete = new google.maps.places.Autocomplete(input);

  autocomplete.bindTo('bounds', map);

  var marker = new google.maps.Marker({
    map: map,
    position: defaultLatLong,
    draggable: true,
    clickable: true
  });

  google.maps.event.addListener(marker, 'dragend', function(marker) {

    locationsArray.push(country);
    console.log(country);
    var latLng = marker.latLng;
    currentLatitude = latLng.lat();
    currentLongitude = latLng.lng();
    var latlng = {
      lat: currentLatitude,
      lng: currentLongitude
    };
    var geocoder = new google.maps.Geocoder;
    geocoder.geocode({
      'location': latlng
    }, function(results, status) {
      if (status === 'OK') {
        if (results[0]) {
          input.value = results[0].formatted_address;
        } else {
          window.alert('No results found');
        }
      } else {
        window.alert('Geocoder failed due to: ' + status);
      }
    });
  });

  autocomplete.addListener('place_changed', function() {
    var place = autocomplete.getPlace();
    if (!place.geometry) {
      return;
    }
    if (place.geometry.viewport) {
      map.fitBounds(place.geometry.viewport);
    } else {
      map.setCenter(place.geometry.location);
    }
    marker.setPosition(place.geometry.location);
    currentLatitude = place.geometry.location.lat();
    currentLongitude = place.geometry.location.lng();
  });

(添加基本情况作为练习)。同样,对于两个人,

  google.maps.event.addListener(marker, 'dragend', function(marker) {
    var country = filtered_array.length ? filtered_array[0].long_name: "";

和三个

(define (map1 f1  xs)
  (cons (f1   (car xs))
        (map1 f1
              (cdr xs))))

我们可以对任何 n 参数函数使用相同的模板,以将其映射到任何 n 列表上,以从以下位置获取 n 参数:

(define (map2 f2  xs  ys)
  (cons (f2   (car xs)  (car ys))
        (map2 f2
              (cdr xs)  (cdr ys))))