2012-02-25 98 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")) 

中(“天”,“美术”)得到的

我不是说这是更好的,只是另一种解决同样问题的方法。

相关问题