2012-02-25 4 views
0

私はClojureを学び始めていますが、なぜ以下のコードが期待通りに動作しないのか理解できません。フィルタが述語関数の結果を返さないのはなぜですか?

文字列を指定すると、最初の文字を大文字にして2文字以上のすべての単語を出力します。 ("Fine" "Day")
実際の出力:("fine" "day")

(ns exploring 
    (:require [clojure.contrib.string :as str])) 

(defn a-function [word] 
    "Capitaliza todas palavras maiores que 2 chars" 
    (if (>(count word) 2) (str/capitalize word))) 

(use '[clojure.contrib.str-utils :only (re-split)]) 
(filter a-function (re-split #"\W+" "A fine day it is")) 
+0

コードを入力しませんでした。 – Rom1

+0

ああ、ここのコードhttps://gist.github.com/1908802 – elf

答えて

3

私はフィルタに加えて、マップを使用します。

(ns exploring 
    (:require [clojure.string :as str]) 
    (:use '[clojure.contrib.str-utils :only (re-split)]) 

(def a-function 
    [word] 
    (> (count word) 2)) 

(map str/capitalize 
    (filter a-function 
      (re-split #"\W+" "A fine day it is"))) 
+1

'filter'は、述語(' a-function')がtrueを返す* original * seqの要素を含むseqを生成するためです。したがって、あなたのソリューションは大文字の結果を生成しません。 – Rom1

+0

確かに、私は理解しています、ありがとう – elf

1

あなたがあなたの元a-functionkeepを使用することができます。

(keep a-function (re-split #"\W+" "A fine day it is")) 
出力期待

+0

なぜですか?この場合、結果は(false true true false false)になります。 –

+0

はい、あなたの変更された述語 'a-function'を使うと、ブール値のseqが生成されます。しかし、私は@ user428691の元の定義を参照しています: '(defn a-function [word](if(>(count word)2)(str/capitalize word))')。 – jbear

0

大文字の単語が返される順序が重要でない場合にも行うことができます:

(「日」「ファイン」)に

結果として得られる

(reduce #(if (> (count %2) 2) (cons (str/capitalize %2) %) %) nil (re-split #"\W+" "A fine day it is")) 

私は、これが優れていると主張していませんよ同じ問題を解決する別の方法です。

関連する問題