为什么过滤器不返回谓词函数的结果?

时间:2012-02-25 14:44:41

标签: clojure

我开始学习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"))

3 个答案:

答案 0 :(得分:3)

除了过滤器我还会使用map:

(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 :(得分:1)

您可以将keep与原始a-function

一起使用
(keep a-function (re-split #"\W+" "A fine day it is"))

答案 2 :(得分:0)

如果返回大写单词的顺序并不重要,您也可以这样做:

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

导致(“日”“好”)

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