사용자 도구

사이트 도구


비동기_프로그래밍과_scala

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
비동기_프로그래밍과_scala [2020/08/09 07:36]
cumul0529 사소한 표현 수정
비동기_프로그래밍과_scala [2020/08/09 07:39] (현재)
cumul0529 [함수형 프로그래밍과 타입 클래스] 마크업 수정
줄 776: 줄 776:
 그렇다면 ''%%Task%%'', ''%%Future%%'', ''%%Coeval%%'', ''%%Eval%%'', ''%%IO%%'', ''%%Id%%'', ''%%Observable%%'' 등의 형을 추상화하는 인터페이스를 만들 수는 없을까요? 그렇다면 ''%%Task%%'', ''%%Future%%'', ''%%Coeval%%'', ''%%Eval%%'', ''%%IO%%'', ''%%Id%%'', ''%%Observable%%'' 등의 형을 추상화하는 인터페이스를 만들 수는 없을까요?
  
-가능합니다. 우리는 이미 순차 실행을 추상화하는 ''%%flatMap%%''을 보았고, 병렬 실행을 추상화하는 ''%%mapBoth%%''를 보았습니다. 하지만 우리는 그러한 기능들을 고전적인 OOP 인터페이스로는 구현할 수 없습니다. 한 가지 이유는, ''%%Function1%%'' 인자에 대한 공변성과 반변성의 법칙(covariance and contravariance rules)에 따라 ''%%flatMap%%''에서 형에 대한 정보가 소실되기 때문입니다. (F-Bound 다형성 타입을 사용하면 소실을 막을 수 있지만, 이 기능은 구현 재사용에 더 적합할 뿐만 아니라 다른 OOP 언어는 지원하지도 않습니다.) 그리고 그보다 더 근본적으로, OOP에서는 데이터 생성자를 메서드로 표현할 수 없기 때문입니다. (즉, OOP의 서브타입은 클래스 전체가 아니라 각각의 인스턴스에 적용되기 때문입니다.)+가능합니다. 우리는 이미 순차 실행을 추상화하는 ''%%flatMap%%''을 보았고, 병렬 실행을 추상화하는 ''%%mapBoth%%''를 보았습니다. 하지만 우리는 그러한 기능들을 고전적인 OOP 인터페이스로는 구현할 수 없습니다. 한 가지 이유는, ''%%Function1%%'' 인자에 대한 공변성과 반변성의 법칙(covariance and contravariance rules)에 따라 ''%%flatMap%%''에서 형에 대한 정보가 소실되기 때문입니다. (F-바운드 다형성 타입을 사용하면 소실을 막을 수 있지만, 이 기능은 구현 재사용에 더 적합할 뿐만 아니라 다른 OOP 언어는 지원하지도 않습니다.) 그리고 그보다 더 근본적으로, OOP에서는 데이터 생성자를 메서드로 표현할 수 없기 때문입니다. (즉, OOP의 서브타입은 클래스 전체가 아니라 각각의 인스턴스에 적용되기 때문입니다.)
  
 마침 Scala는 상류 타입(higher kinded types)을 지원하는 몇 안되는 언어에 속하고 [[https://en.wikipedia.org/wiki/Type_class|타입 클래스]]를 지원하기 때문에 Haskell의 기능을 그대로 옮겨오는 것이 가능합니다. 😄 ((**역주** 'higher kinded types'를 어떻게 번역해야 좋을지 난처하던 차에, '상류 타입'이라는 번역어를 [[https://twitter.github.io/scala_school/ko/advanced-types.html|한국어판 Scala School]]에서 빌려왔습니다. 해당 문서에도 '상류 타입'이라는 번역어에 대한 고민이 자세하게 역주로 붙어 있습니다. 이외에도 다른 OOP 언어에서 잘 쓰이지 않는 Scala 특유의 개념들은 대부분 한국어판 Scala School의 번역을 참고했습니다.)) 마침 Scala는 상류 타입(higher kinded types)을 지원하는 몇 안되는 언어에 속하고 [[https://en.wikipedia.org/wiki/Type_class|타입 클래스]]를 지원하기 때문에 Haskell의 기능을 그대로 옮겨오는 것이 가능합니다. 😄 ((**역주** 'higher kinded types'를 어떻게 번역해야 좋을지 난처하던 차에, '상류 타입'이라는 번역어를 [[https://twitter.github.io/scala_school/ko/advanced-types.html|한국어판 Scala School]]에서 빌려왔습니다. 해당 문서에도 '상류 타입'이라는 번역어에 대한 고민이 자세하게 역주로 붙어 있습니다. 이외에도 다른 OOP 언어에서 잘 쓰이지 않는 Scala 특유의 개념들은 대부분 한국어판 Scala School의 번역을 참고했습니다.))
줄 784: 줄 784:
 > 하지만 그러한 설명 방식은 Scala와 사용자 모두에게 민폐입니다. 다른 언어에서 저 개념들은 단순히 설명하기 어려운 디자인 패턴에 불과합니다. 대부분의 다른 언어들은 형에 대한 표현성이 부족하기 때문입니다. 저 개념들을 표현할 수 있는 언어는 손에 꼽습니다. 언어 사용자의 입장에서도 문제가 생겼을 때 저 개념들을 모른 채 관련된 자료를 검색하는 것은 매우 고통스러운 일입니다. > 하지만 그러한 설명 방식은 Scala와 사용자 모두에게 민폐입니다. 다른 언어에서 저 개념들은 단순히 설명하기 어려운 디자인 패턴에 불과합니다. 대부분의 다른 언어들은 형에 대한 표현성이 부족하기 때문입니다. 저 개념들을 표현할 수 있는 언어는 손에 꼽습니다. 언어 사용자의 입장에서도 문제가 생겼을 때 저 개념들을 모른 채 관련된 자료를 검색하는 것은 매우 고통스러운 일입니다.
  
-> 또 저는 이것이 모르는 것에 대한 본능적인 공포에서 나오는 일종의 [[https://en.wikipedia.org/wiki/반지성주의]]라고 생각합니다. 예를 들어서 Java의 [[https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html|Optional]]형은 함자 법칙(functor law)에 위배됩니다. (즉, ''%%opt.map(f).map(g) != opt.map(f andThen g)%%''입니다.) Swift에서는 어이없게도 ''%%5 == Some(5)%%''입니다. ''%%Some(null)%%''도 이상하지 않습니다. ''%%null%%''이 ''%%AnyRef%%''의 유효한 값이기 때문입니다. 그렇지 않았더라면 ''%%Applicative[Option]%%''를 정의하는 것이 불가능했을 것입니다. 이 예시들을 어떻게 반지성주의자들에게 설명할 수 있겠습니까.+> 또 저는 이것이 모르는 것에 대한 본능적인 공포에서 나오는 일종의 [[https://en.wikipedia.org/wiki/반지성주의|반지성주의]]라고 생각합니다. 예를 들어서 Java의 [[https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html|Optional]]형은 함자 법칙(functor law)에 위배됩니다. (즉, ''%%opt.map(f).map(g) != opt.map(f andThen g)%%''입니다.) Swift에서는 어이없게도 ''%%5 == Some(5)%%''입니다. ''%%Some(null)%%''도 이상하지 않습니다. ''%%null%%''이 ''%%AnyRef%%''의 유효한 값이기 때문입니다. 그렇지 않았더라면 ''%%Applicative[Option]%%''를 정의하는 것이 불가능했을 것입니다. 이 예시들을 어떻게 반지성주의자들에게 설명할 수 있겠습니까.
  
 ==== Monad (연속 실행과 재귀 실행) ==== ==== Monad (연속 실행과 재귀 실행) ====
비동기_프로그래밍과_scala.1596958590.txt.gz · 마지막으로 수정됨: 2020/08/09 07:36 저자 cumul0529