2012-07-16 1 views
5

나는 scalaz를 실험 중입니다. 응용 프로그램 코드에서 코드 작성을 시도했습니다. 나는 다음과 같은 코드를 작성했습니다 :scalaz에 haskell과 유사한 응용 문법이 있습니다

val max: Option[Int] = (a |@| b) { math.max(_, _) } 

나는이 코드를별로 좋아하지 않았습니다. 하스켈 스타일에 더 가까운 코드를 작성하고 싶습니다.

가능합니다. 그리고 왜 스카 파는 그것을이 방법으로 구현하지 않았는가?

+0

호기심에서 벗어나기 : 당신이 싫어하는 것은 무엇입니까? 나는 내 눈에 "스 카스 버전"클리너를 찾았습니다. – Jan

+1

하스켈에서 실제로'max <$><*> b '라고 쓰고 싶습니다. 나는 개인적으로 Scalaz 버전을 선호합니다. –

+0

@TravisBrown 어떻게 두 개 이상의 args에 대해 작성 하시겠습니까? "재미 <$> a <*> b <*> c"? – Jan

답변

7

스칼라의 유추 추론은 하스켈 (식별자 오버로딩, 이유 중 하나 인 JVM과 함께 제공됨)보다 훨씬 제한적입니다. 추론은 왼쪽에서 오른쪽으로 진행되며 함수의 인수 유형은 이전 컨텍스트에서 추론 될 수 있습니다 (정의 위치에있는 경우 arg 유형이 A 인 함수가 예상되지만). 정의. Scalaz 구문을 사용하면 인수 유형을 사용할 수 있습니다. 이것을 반전하면 대부분의 경우 함수 인자 타입을 쓰게됩니다.

{math.max(_: Int, _: Int) } <$> a <*> b 
+0

전체 유형이 이미 알려진 기존 함수 값을 처리 할 때는 여러 번 있습니다. 이 경우'f <$> a <*> b '구문을 사용하고 싶습니다. 익명의 함수의 경우에 대해 우리는 이미''(a | @ | b) {math.max (_, _})'를 사용하고 있기 때문에 자연적인 Haskell과 같은 것을 가질 수없는 이유는 알지 못한다. 함수 값의 대문자. –

4

조금 더 자세한 기꺼이 있다면 당신은 직접 스칼라에 하스켈 버전을 번역 할 수 있습니다 :

val c = 2.some <*> 1.some.map(x => math.max(x, _: Int)) 
:

import scalaz._, Scalaz._ 

val a = Option(1) 
val b = Option(2) 
val f: Int => Int => Int = x => math.max(x, _) 

val c = b <*> (a map f) 

또는 한 - 라이너

또는

val c = 2.some <*> (1.some map (math.max _).curried) 

중위 연산자 대신 메소드 호출이기 때문에 순서가 뒤 바뀌지 만, 기본적으로 max <$> a <*> b과 같습니다 : 함수를 첫 번째 항목에 매핑 한 다음 두 번째 항목에 적용합니다.