벡터를 통해 부작용으로 기능을 수행하려면 어떻게합니까?

StackOverflow https://stackoverflow.com//questions/21069188

  •  02-01-2020
  •  | 
  •  

문제

SAY-Hello-to-first-person은 괜찮습니다.

(defpartial greeting [name]
  [:p.alert "Hello " name ", how are you?"])

(defn say-hello [name]
  (append $content (greeting name)))

(defn say-hello-to-first-person [names]
  (say-hello (first names)))

(defn say-hello-to-everyone [names]
  (map say-hello names))

(say-hello-to-first-person ["Chris" "Tom" "Jim" "Rocky"])
(say-hello-to-everyone ["Chris" "Tom" "Jim" "Rocky"])
.

도움이 되었습니까?

해결책

doseq , colluure의 "foreach":

(doseq [name names]
  (say-hello name))
.

map가 게으른 시퀀스를 생성하기 때문에 작동하지 않습니다. 시퀀스 (여기에 있지 않은)의 항목에 실제로 액세스 할 때까지는 평가되지 않으며 부작용이 발생하지 않습니다.

다른 옵션은 dorun 주위에 래핑하여 평가를 강제로 강제로 평가하는 것입니다.이 작품이 왜 당신의 이해를 도울 수 있는지 생각할 수 있습니다 (map는 여기에 관용적 인 접근 방식이지만).

다른 팁

@edbond는 그의 의견에서지도 Fn이 Lazy Seq을 반환하기 때문에 Fn이 필요한 순간까지 평가하지 않습니다.

이것은 fn의 doc입니다. F를 적용한 결과로 구성된 게으른 서열을 반환합니다. 각 콜의 첫 번째 항목을 설정 한 다음 F에 f를 적용합니다. 각 콜의 두 번째 항목은 콜 중 하나가 될 때까지 소진.다른 콜스의 나머지 항목은 무시됩니다.함수 f는 주력 수를 허용해야합니다.

값이 코드의 한 특정 부분에서 평가되어야하는 경우 doall 또는 Dorun

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top