Почему фильтр не возвращает результат функции предиката? - PullRequest
0 голосов
/ 25 февраля 2012

Я начинаю изучать 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 ]

3 голосов
/ 25 февраля 2012

Я бы использовал карту в дополнение к фильтру:

(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 голос
/ 26 февраля 2012

Вы можете использовать keep со своим оригиналом a-function:

(keep a-function (re-split #"\W+" "A fine day it is"))
0 голосов
/ 26 февраля 2012

Если порядок возврата заглавных слов не важен, вы также можете сделать следующее:

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

В результате ("День", "Штраф")

Я не утверждаю, что это лучше, просто еще один способ решить ту же проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...