2017-03-18 19 views
0

Schemeで "foldr"を使用してリストをフィルタリングしようとしていますが、特定の述語で "true"を返す要素のみをリストに残そうとしています。 私はスキームでfoldr /リットル(例えば、this one)について、ここで以前discussingsを使用しようとしましたが、このコードで出てきた:Schemeでfoldrを使用したフィルタリスト

(define (filterb pred? lst) 
(foldr (lambda (e a) 
     (if (pred? e) 
      (cons e a) 
      a)) 
    lst 
    '())) 

実行しているコマンドは、たとえば次のとおりです。

(filterb ? '(1 2 3 4))

しかし、残念ながら、常に指定されたリストを返します。

私は何が間違っているのか、なぜフィルタリングが行われていないのか、いくつかの助けを得ることができてうれしいです。 ありがとう!

+2

'foldr'は通常、そのために、その引数を取りません。ドキュメントを確認してください。 – molbdnilo

+0

ありがとう!それでおしまい... – avish12

答えて

1

documentationに記載されているように、foldrは、通常、手続き、初期値、および入力リストをこの順番でパラメータとして取ります。。あなたのコードはほとんど正しいですが、foldrに渡された最後の2つの引数は逆です。コメントで述べたように、あなたは、単に順番を逆にする必要があります。

(define (filterb pred? lst) 
    (foldr (lambda (e a) 
      (if (pred? e) 
       (cons e a) 
       a)) 
     '() 
     lst)) 

期待通りに動作します:

(filterb even? '(1 2 3 4)) 
=> '(2 4) 
関連する問題