2012-08-29 6 views
8

:적용 펑 터는 병렬 알고리즘과 어떻게 관련되어 있습니까? (스칼라와 Scalaz) 조쉬 Suereth의 "스칼라 깊이에서"에서

"실용적 펑은 두 가지 계산을하고 기능을 사용하여 함께 가입 할 수있는 방법을 제공하는에 이동 예제에서는 두 개의 컬렉션이 쌍으로 병렬 처리 할 수있는 방법을 강조한다. 응용 펑터와 병렬 처리는 빵과 버터처럼 함께 진행됩니다. "

저는 전체 펑터/모나드/응용 프로그램에 대한 모호한 생각을 가지고 있습니다. 그러나 모나드/응용 프로그램을 완전히 이해하지는 못했습니다. 나는 모나드 (flatten, flatMap)와 모나드 워크 플로우 및 펑터 (맵) 개념에 대해 약간 이해하고 있습니다.

누구나 "전통적인"병렬화와 비교하여 어떻게 완료 되었습니까, 예제 및/또는 이점이 있는지 상세히 알려주십시오.

+0

[내 슬라이드] (https://docs.google.com/presentation/d/1iiTmrGkc7lZHcrgQOQ1xfro82BvFOqoVSnhH-HdWPx4/present#slide=id.p)에 예가 있습니다. –

답변

12

나는 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를 사용하는 라이브러리를 선택해야하므로)

+0

(processX, processY, processZ)지도를 사용해 보았습니다. {(x, y, z) => ...}하지만 컴파일되지 않습니다.TupleX [Validation, ...]의 매핑을 scalaz7의 특징으로 사용합니까? –

+0

조쉬가 스 카스를 전혀 언급하지 않는다고 생각합니다. 그를이 스레드로 안내 할 것입니다. –

+1

그래, 나의 게시물은 Scalaz에 국한되지 않고보다 기본이다. 나는 스칼라즈의 개념과 함께 SBT의 응용 문법을 사용했다. 알맞은 입문서가 있습니다. https://github.com/bartschuller/scalaz-validation-example – jsuereth