我知道通过将函数(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中的工作原理?
答案 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))
并了解3
是caaddr
,因为这对是(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))))