일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 블록체인
- play2 강좌
- 주키퍼
- 파이썬 데이터분석
- 파이썬 강좌
- Adapter 패턴
- Play2
- Akka
- play 강좌
- CORDA
- Play2 로 웹 개발
- 스칼라 동시성
- 안드로이드 웹뷰
- Actor
- 엔터프라이즈 블록체인
- 이더리움
- 파이썬 동시성
- 파이썬 머신러닝
- 하이퍼레저 패브릭
- 플레이프레임워크
- 스칼라 강좌
- Golang
- hyperledger fabric
- 하이브리드앱
- 파이썬
- 그라파나
- 스칼라
- Hyperledger fabric gossip protocol
- 스위프트
- akka 강좌
- Today
- Total
HAMA 블로그
스칼라 강좌 (25) - 부분 함수 (Partial function) 본문
Partially applied function 과 Partial function
먼저 아래 링크 참고 하세요. (아웃사이더님이 번역하신 글이 있습니다)
https://blog.outsider.ne.kr/953
아마 저 글을 읽어도 Partial function에 관해 조금 헤깔리실텐데요. 간략하게 다시 설명해 드리겠습니다.
함수란 모든 x 에 대해서 y 라고 할때 부분 함수란 일부 x 에 대해서 y 인 함수를 말 합니다. 즉 제한을 둔겁니다.
예를들어
function A (int x ) {
return x * x
}
라는 함수에 대해서 아래 함수는 부분함수입니다.
function A' (int x) {
if x > 10
return x * x
}
모든 것을 처리하지 않고 싶을 때 부분 함수를 만들게 됩니다.
그 모든 것 말고 예외인 항목을 입력하면 에러/예외가 발생하게 말이죠.
그 예외 항목이 먼지 알려주는 함수가 isDefinedAt 입니다.
따라서 이 함수를 먼저 이용해서 해당 파라미터가 그 부분함수에서 잘 작동하는지 확인한 후에
파라미터를 넘긴다는 야그죠.
아래 예제를 봅시다.
scala> List(41, "cat") map { case i: Int ⇒ i + 1 }
scala.MatchError: cat (of class java.lang.String)
"cat" 이 map 으로 전달되면 case 에 매칭되지 않기 때문에 에러가 나는데
scala> List(41, "cat") collect { case i: Int ⇒ i + 1 }
res1: List[Int] = List(42)
Collect 경우는 괜찮네요?
네 Collect 경우는 isDefinedAt 으로 부분함수에 대한 검증을 합니다.
마지막으로 PartialFunction 은 아래와 같이 만들며 자동으로 isDefinedAt 이 만들어지는게 특징입니다.
[Int, Int] 는 인자로 Int 리턴값으로 Int 를 말합니다.
val fraction: PartialFunction[Int, Int] =
{ case d: Int if d != 0 ⇒ 42 / d }
이 경우 isDefindAt 에 0 이 들어가면 false 를 내보내겠지요?
마지막 예제를 보면서 생각해 보는 시간을 가지세요 ^^
scala> val liar: PartialFunction[Any, Int] =
{ case i: Int ⇒ i; case s: String ⇒ s.toInt }
liar: PartialFunction[Any,Int] = <function1>
scala> liar.isDefinedAt(42)
res10: Boolean = true
scala> liar.isDefinedAt("cat")
res11: Boolean = true
scala > liar ("3")
res12: Int = 3
scala> liar("cat")
java.lang.NumberFormatException: For input string: "cat"
scala> val honest: PartialFunction[Any, Int] =
{ case i: Int ⇒ i; case s: String if isParsableAsInt(s) ⇒ s.toInt }
honest: PartialFunction[Any,Int] = <function1>
scala> honest.isDefinedAt("cat")
res12: Boolean = false
'Scala' 카테고리의 다른 글
스칼라 강좌 (27) - 모나드 (Monad) (0) | 2016.11.08 |
---|---|
스칼라 강좌 (26) - JSON 다루기 (0) | 2016.10.19 |
스칼라 강좌 (24) - 언더스코어 _ (0) | 2016.10.03 |
스칼라 강좌 (23) - Null 과 친구들 (None, Nil, Unit) (0) | 2016.09.30 |
스칼라 강좌 (22) - apply 정리 (0) | 2016.09.30 |