2015-02-03 4 views
3

고차 함수의 인수로 두 개의 매개 변수 목록을 사용하는 함수 객체를 전달하려고한다고 가정합니다. 그러한 객체의 유형은 무엇입니까?스칼라 : 두 개의 매개 변수 목록을 사용하는 함수 객체의 유형은 무엇입니까?

object passMe extends <???> { 
    def apply(x: Double)(implicit ctx: Context): String = . . . 
} 

내가 extends 후 넣어해야합니까 :

예를 들어,이 같은 객체가 될 수 있는가? 또는 passMe을 매개 변수로 허용하는 함수를 선언하려면 어떻게해야합니까? 즉 내가 관심이있는 것을 중심으로 이후

def foundation(xs: Seq[Double], oneOfThoseObjects: <???>)(implicit ctx: Context): Unit = { 
    . . . 
    xs.map(oneOfThoseObjects).toSet. . . . 
} 

내 예는 암시 적 매개 변수 목록을 사용하지만, 여전히이 명시 적 매개 변수 목록을 가진 함수를 선언하는 방법을 알고 도움이 될 것이다. 나는 그런 선언이 어떻게 생겼는지를 나타내는 Function1, Function2, ... series에서 아직 아무것도 발견하지 못했다.

+0

함수의 반환 형식은 무엇입니까? –

+0

@IanMcLaird 예제에서'String'을 사용했습니다. –

답변

2

두 개의 매개 변수 목록이있는 함수는 다른 함수를 반환하는 함수로 모델링 할 수 있습니다. 이것은 currying이라는 기술입니다. 이 같은

scala> val add:Function1[Int,Function1[Int, Int]] = x => (y => x + y) 
add: Int => (Int => Int) = <function1> 

을 그리고 전화 : 예를 들어, 추가 기능은 다음과 같이 쓸 수

당신이 볼 수 있듯이, 동일한 유형이 Function1=> 구문을 모두 기록 할 수
scala> add(1)(2) 
res1: Int = 3 

. 일부 REPL에서 장난 후

+2

아, 고마워. 뒤늦게 알다시피,'add (1)'은 하나의 매개 변수 목록 함수이므로 추측해야합니다. 매개 변수 목록이 암시 적임을 나타내는 방법을 알고 있습니까? –

+0

암시 적 매개 변수 목록과 함께 작동 시키려고했으나 가능하지 않다고 생각합니다. 암묵적인 매개 변수 목록을 가진'apply' 메쏘드로 클래스를 정의한 다음이 클래스의 인스턴스를'add' 함수로 리턴 할 수 있습니다. 그러나 명시 적으로 인수를 전달하지 않고'apply' 메쏘드를 호출 할 방법이 없습니다. –

1

, 나는이에 도착 :

(Double => (Context => String)) 

어떤 영어로 말한다, "함수 문자열 더블을 복용하고 문맥을 복용하는 함수를 반환하고 반환"

따라서, 귀하의 passMe 객체는 다음과 같이 보일 것이다 : 그러나

object passMe extends (Double => (Context => String)) { 
    def apply(d: Double) = { 
    def f(c: Context) = "...something..." 
    f _ 
    } 
} 

, 암시 적 매개 변수의이 작동하지 않습니다 때문에이 때문에 t으로 그는 암시 적 매개 변수, 형식 불일치로 끝납니다 (scala.collection.immutable.WrappedString 필요). 그래서 결국 결국 이랬어 :

object passMe extends (Double => scala.collection.immutable.WrappedString) { 
    def apply(d: Double) = { 
    def f(implicit c: Context) = "...something..." 
    f _ 
    } 
} 
+0

아, 이제는 여러 매개 변수 목록이 함수를 반환하는 함수의 구문 설탕이라는 것을 보았습니다.이 함수는 명시 적으로 설명했습니다. 'WrappedString'은 어디에서 왔습니까? 스칼라가'재단 '에서'oneOfThoseObjects'에'ctx'를 전달하도록 설득하는 것과 관련이 있습니까? –

+0

솔직히, 나는 잘 모르겠다. 'WrappedString'은'implicit'을 추가 할 때 나타납니다. 나는 누군가가 그것을 나에게 설명 할 수 있기를 바란다. –