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

Clojure 为什么过滤器不返回谓词函数的结果?,clojure,Clojure,我开始学习Clojure,但我不明白为什么下面的代码不能按预期工作 给定一个字符串,我希望它打印所有长度超过2个字符且首字母大写的单词 预期输出:(“晴天”) 实际输出:(“晴天”) 除过滤器外,我还将使用map: (ns exploring (:require [clojure.string :as str]) (:use '[clojure.contrib.str-utils :only (re-split)]) (def a-function [word] (> (

我开始学习Clojure,但我不明白为什么下面的代码不能按预期工作

给定一个字符串,我希望它打印所有长度超过2个字符且首字母大写的单词

预期输出:
(“晴天”)

实际输出:
(“晴天”)


除过滤器外,我还将使用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")))

除过滤器外,我还将使用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")))

您可以将
keep
与原始
a-函数一起使用

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

您可以将
keep
与原始
a-函数一起使用

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

如果大写单词的返回顺序不重要,您也可以执行以下操作:

(reduce #(if (> (count %2) 2) (cons (str/capitalize %2) %) %) nil (re-split #"\W+" "A fine day it is"))
导致(“罚款日”)


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

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

(reduce #(if (> (count %2) 2) (cons (str/capitalize %2) %) %) nil (re-split #"\W+" "A fine day it is"))
导致(“罚款日”)


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

哦,该死,这里的代码哦,该死,这里的代码是因为
filter
生成一个包含原始seq元素的seq,谓词(
a-function
)返回true。因此,您的解决方案不会产生大写的结果。因为
filter
生成一个包含原始seq元素的seq,谓词(
a-function
)会为其返回true。所以你的解决方案不会产生资本化的结果。为什么?在这种情况下,这只会导致(false-true-false)。是的,使用修改后的
a-function
谓词将产生一系列布尔值。但我指的是@user428691的原始定义:
(defn a-function[word](if(>(count word)2)(str/capitalize word))
。为什么?在这种情况下,这只会导致(false-true-false)。是的,使用修改后的
a-function
谓词将产生一系列布尔值。但我指的是@user428691的原始定义:
(defn a-function[word](if(>(count word)2)(str/capitalize word))