2

私はSchemeがまったく初めてで、独自の map 関数を実装しようとしています。私はそれをオンラインで見つけようとしましたが、遭遇したすべての質問は、いくつかの複雑なバージョンの map 関数 (2 つのリストを入力として受け取る関数のマッピングなど) に関するものでした。

私が見つけた最良の答えはここにあります:( For-each and map in Scheme )。この質問のコードは次のとおりです。

(define (map func lst)
  (let recur ((rest lst))
    (if (null? rest)
      '()
      (cons (func (car rest)) (recur (cdr rest))))))

あいまいな関数を使用しているため、問題は解決しませんrecur。私には意味がありません。

私のコードは次のようになります。

(define (mymap f L)
  (cond ((null? L) '())
    (f (car L))
    (else (mymap (f (cdr L))))))

この言語でプログラミングするときの関数型アプローチの背後にあるロジックは理解していますが、コーディングには非常に苦労しています。

4

2 に答える 2

1

独自のリスト プロシージャを実装する場合は、可能であれば適切な末尾呼び出しを使用していることを確認する必要があります。

(define (map f xs)
  (define (loop xs ys)
    (if (empty? xs)
        ys
        (loop (cdr xs) (cons (f (car xs)) ys))))
  (loop (reverse xs) empty))

(map (λ (x) (* x 10)) '(1 2 3 4 5))
; => '(10 20 30 40 50)

または、元のコードに見られるように、名前付きの let式を使用して、これをもう少し甘くすることもできます。ただし、これは適切な末尾呼び出しを使用します

(define (map f xs)
  (let loop ([xs (reverse xs)] [ys empty])
    (if (empty? xs)
        ys
        (loop (cdr xs) (cons (f (car xs)) ys)))))

(map (λ (x) (* x 10)) '(1 2 3 4 5))
; => '(10 20 30 40 50)
于 2016-03-10T03:53:28.903 に答える