2012-02-25 137 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 2012-02-25 14:47:58

+0

呵呵,這裏的代碼https://gist.github.com/1908802 – elf 2012-02-25 14:49:17

回答

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'產生一個seq,其中包含* original * seq的元素,謂詞('a-function')返回true。所以你的解決方案不會產生資本化的結果。 – Rom1 2012-02-25 15:07:52

+0

當然,我現在明白了,謝謝 – elf 2012-02-25 15:13:35

1

您可以使用keep你原來a-function

(keep a-function (re-split #"\W+" "A fine day it is")) 
+0

爲什麼?在這種情況下,只會導致(false true true false false)。 – 2012-02-26 15:26:52

+0

是的,使用修飾後的謂詞「a-function」會產生一個布爾值序列。但是我指的是@ user428691的_original definition_:(defn a-function [word](if(>(count word)2)(str/capitalize word)))''。 – jbear 2012-02-27 06:15:42

0

如果在其中返回大寫單詞的順序並不重要,你也可以這樣做:

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

中(「天」,「美術」)得到的

我不是說這是更好的,只是另一種解決同樣問題的方法。

相關問題