2014-06-05 3 views
3

나는 다음과 같은 스칼라 코드를 가지고 :이 무엇을 주위에 내 머리를 정리하기 위해 노력하고있어Scala에서이 함수를 호출하는 것이 왜 효과가 있습니까?

type Set = Int => Boolean 

def contains(s: Set, element:Int): Boolean = s(element) 

def singletonSet(element: Int): Set = Set(element) 

val oneElementSet = singletonSet(5) 

contains(oneElementSet, 5) // true 
contains(oneElementSet, 6) // false 

: 세트 (요소). Int 인자 대신에 요소를 대체하여 5 => Boolean을 생성하는 것처럼 보입니다. 어디에도 비교가 없으므로 oneElementSet (5)가 true를 반환하고 oneElementSet (6)이 false를 반환하는 이유는 무엇입니까?

감사합니다.

+2

'singletonSet'에 의해 반환 된'Set'가 정의 된 전체 패키지를 확인할 수 있습니까? 나는 당신이'scala.collection.immutable'에서 정상적인'Set '을 사용하고 있다고 생각하고,'Set Set = Int => Int'를 설정하려고합니다. 코드가 여전히 작동한다면 실제로'Set'을 사용하지 않습니다. 'scala.collection.immutable'에 정의되어 있습니다. – Peter

+0

이것은 coursera FunProg와 같습니다. Set 형에 다른 이름을 사용하여'scala.collection.immutable.Set'과의 충돌을 피할 수 있습니다 :'type MySet = Int => Boolean'과 같은 일을하고 * 작동하지 않아야합니다. 싱글 톤 세트의 impl은 운동 관점에서 잘못된 것입니다. 힌트 :'singletonSet'은 함수의 정의를 가지고 구현되어야합니다 :'Int => Boolean' – maasg

+0

이것은 실제로 Coursera의 'Functional Programming in Scala'과정에서 나온 것입니다. 팁 주셔서 감사합니다;) – MaxK

답변

2

스칼라에는 유형과 값을위한 별도의 네임 스페이스가 있습니다. 형식 별칭은이 유형 네임 스페이스에 정의되어 있지만 singletonSetSet의 정의는 값 네임 스페이스에서 제공되며 실제로는 컴패니언 개체 scala.collection.immutable.Set입니다. Set(element)Int => Boolean의 하위 유형으로 밝혀 졌으므로 scala.collection.immutable.Set[Int]을 반환하는 동반자 개체의 apply 메서드를 호출하므로 Set (사용자의 유형 별칭)입니다.

+0

그래, 그게 다야. 'Set (element)'는'scala.collection.immutable.Set [Int]'의 인스턴스를 생성합니다. 나를 도와 주신 많은 분들께 감사드립니다! – MaxK

관련 문제