나는 Josh Suereth에게 질문을 전달했다. -
내가 응답 할 시간이 많지 않아,하지만 난 무슨 뜻인지 의 예를 제공합니다
마이크 : 이것은 그의 대답이다
예 # 1 - 양식 유효성 검사.
나는 즉, 일부 입력에 대한 확인 및 집계 모든 오류를 실행 병렬에서 그들을 발견하고 싶습니다. 적용 가능한 기능을 사용하면 I 을 사용할 수 있습니다.
그래서, "처리"기능의 설정과 같이 주어진 :
def processUser(data: Data): Validation[User] = {
if (data get "username" isEmpty) Failure("username must not be empty")
else {
val Some(user) = data get "username"
if (user contains badCharacterRegex) Failure(s"username must not contain one of ${badchars}")
else Success(user)
}
}
def processCreditCard(data: Data): Validation[CreditCard] = ...
def processAddress(data: Data): Validation[Address] = ...
def handleForm(data: Data): ??? = {
(processUser(data), processCreditCard(data), processAddress(data)) map { (user, card, address) =>
postPayment(user, address, card)
} recover { (errors) =>
errors foreach println
}
이제 결합 된 후로 형태가 동시에 크레딧 카드/사용자 이름 + 주소 모두와 오류를 인쇄합니다 처리 그들은 응용 펑터를 사용합니다. 이것은 병렬 오류보고입니다 (실제로는 테스트가 병렬로 수행되지는 않습니다).
(2) 선물
나는 병렬로 몇 일을하고 결과를 결합하려는. Future 's "zip"방법은 사실상 변장에 적용 할 수있는 functor입니다. 나는 이 작업을 수행 할 수 있습니다
Future(computation1) zip Future(computation2) map { case (one,two) => .... }
난 그냥 병렬 계산을 "결합"하는 실용적 펑터를 사용했습니다.
양식 유효성 검증 예제와 정확히 동일합니다.
희망 하시겠습니까? - 조쉬
(이 코드 조각이 아닌 컴파일 가능한 예주의, 나는 Scalaz의 개념 SBT의 실용적 구문을 사용했다, 당신은 그들이에 적용하는 것을 applicatives를 사용하는 라이브러리를 선택해야하므로)
[내 슬라이드] (https://docs.google.com/presentation/d/1iiTmrGkc7lZHcrgQOQ1xfro82BvFOqoVSnhH-HdWPx4/present#slide=id.p)에 예가 있습니다. –