C JS 러스트 파이썬 자바
가 내가 배운 언어고
하스켈이 최근에 배운 언어다.
하스켈은 다르다.
앞 다섯 언어는 하스켈과 비교한다면 서로서로 거의 유사하다.
객체지향은 절차지향의 불편함을 발전시킨 철학이라고 생각한다.
다른말로는, 절차지향으로 코드를 짜더라도 객체지향적 사고를 해야한다.
객체지향을 배우면서,
"함수형이 있대. 함수형이 더 발전된거래"라는 수근거림을 듣곤 햔다.
객체지향을 하면서도 또다시 철학적업그레이드가 이뤄진건가?
그러면 함수형 철학을 배워서 업그레이드하고,
객체지향의 철학에 함수형철학을 얹어야하나?
이에 대한 내 답변은 NO다.
함수형은 객체지향의 발전형이 아니다.
절차지향과 객체지향은 뿌리가 같지만,
함수형은 뿌리가 다르다.
C에서부터 파생된 언어가 아니라는 뜻이다.
함수형은 독자적으로 발전했고, 독자적인 기법을 쓴다.
마치, C 문화권이 서양이라면,
함수형은 동양이다.
객체지향이 최근에 함수형을 차용하는건, 동양의 문물을 가져가서 쓰는것 뿐, 철학, 근본은 여전히 객체지향이다.
그러면 무엇이 그 뿌리의 차이점인가.
{ 차이점 }
1. 함수형은 데이터타입을 Table(struct 혹은 class) 이 아닌, Sum 과 Product, 재귀로 선언한다.
이는 데이터를 바라보는 관점의 차이이다.
Product가 곧 struct아니냐 할 수 있는데, Sum과 재귀는 크나 큰 차이이다.
객체지향이 객체라는 단어를 쓰는 시점에서 이부분은 차이가 난다.
함수형에서 데이터타입은 알고리즘과 닮는다. 따라서 이부분에서 알고리즘을 바라보는 자세도 차이가 난다.
2. 함수형은 공간에서 데이터를 읽고, 쓰지 않는다. 변수가 없다.
변수가 불변인게 아니다. 불변은 함수형을 객체지향으로 변환할때 오역하게 되는 것이고
실상 함수형은 변수가 없다. 함수형은 표현식에 이름을 붙인다.
공간에 데이터를 집어넣는게 아니라, 미해결된 표현식을 미해결상태로 alias 붙인다.
3. 함수형은 연산을 단 한번만 진행한다.
함수형은 여러연산을 하고싶을 경우, 연산을 체이닝한다.
이 말을 단순하게 서술하자면, 하스켈은 모나드의 bind를 통해 연산을 엮는다.
즉 함수형은 자바의 stream이 선택이 아닌 필수다.
함수형은 모든 연산이 스트림으로 진행된다.
이 세가지 차이점은, 객체지향의 발전 사항이 아니다.
대규모 코드처리, 다형성 처럼 무언가 추가되고 발전된 개념이 아닌,
아예 별개의 것이고 기존의 객체지향과 우열을 가릴 수 없다.
단지, 함수형이 자신의 문제를 해결하기 위해 채용한 테크닉들을
객체지향에 맞게 로컬라이즈시켜서 객체지향 언어들이 가져갔을 뿐이다.
저 세가지 차이점은 또한 객체지향과 함수형이 양립불가능하다는걸 의미하기도 한다.
정말 함수형을 공부하고 싶은 사람은,
앞의 저 세가지 차이점에 주목하고,
"아니 그러면 C로 하던걸 함수형은 어떻게 해?" 를 해결해보길 바란다.
답은 모나드다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
여기까지가 2023 4월 29일까지의 딱국생각.
하지만 내가 써놓고도 틀린점이 있다는걸 안다.
1. 함수형을 하스켈과 동일시 여기고 있음
리습은 함수형의시초격이지만 데이터타입이 없으므로 재귀적 데이터타입은 함수형을 나타내는 성질이 아닐수도 있다.
2. 스칼라는 객체지향과 함수형의 통합을 이루어냈다고 주장함.
그래서 나는 고의적으로 스칼라를 함수형공부의 최후방에 두었음.
사람들은 나보고 객지에 익숙한 스칼라로 입문하라고 했지만, 나는 그건 아예 잘못된 접근법이라고 생각.
내가 함수형을 공부하기로 마음먹은 이유는,
모든언어가 지네들이 함수형이라고 주장하는데 내 눈엔 전부 객체지향으로 보였기 때문임.
그러면 함수형의 퓨어한 구현체인 하스켈 너또한 객체지향이냐? 를 보고싶었음.
하스켈은 아예 뿌리부터가 달랐음.
스칼라를 접근할때 객체지향적으로 접근한다는것은.
스칼라를 그냥 코틀린처럼 쓰겠다는건데 난 그러기 싫었음.
난 스칼라를 1대 1 동등하게,
자바와 하스켈의 완벽한 중재자로 쓰고 싶음.
아니, 현재로선 그게 가능한 것인지를 의문품고있음.
솔직히 스칼라도 객체지향일까봐 두려움.
뭐 까봐야알겠지.
만약 스칼라가 두 철학을 융합했다?
오우 쉣 그럼 난 스칼라 정말 사랑할것임
긴글 읽어주셔서 감사합니다.
가 내가 배운 언어고
하스켈이 최근에 배운 언어다.
하스켈은 다르다.
앞 다섯 언어는 하스켈과 비교한다면 서로서로 거의 유사하다.
객체지향은 절차지향의 불편함을 발전시킨 철학이라고 생각한다.
다른말로는, 절차지향으로 코드를 짜더라도 객체지향적 사고를 해야한다.
객체지향을 배우면서,
"함수형이 있대. 함수형이 더 발전된거래"라는 수근거림을 듣곤 햔다.
객체지향을 하면서도 또다시 철학적업그레이드가 이뤄진건가?
그러면 함수형 철학을 배워서 업그레이드하고,
객체지향의 철학에 함수형철학을 얹어야하나?
이에 대한 내 답변은 NO다.
함수형은 객체지향의 발전형이 아니다.
절차지향과 객체지향은 뿌리가 같지만,
함수형은 뿌리가 다르다.
C에서부터 파생된 언어가 아니라는 뜻이다.
함수형은 독자적으로 발전했고, 독자적인 기법을 쓴다.
마치, C 문화권이 서양이라면,
함수형은 동양이다.
객체지향이 최근에 함수형을 차용하는건, 동양의 문물을 가져가서 쓰는것 뿐, 철학, 근본은 여전히 객체지향이다.
그러면 무엇이 그 뿌리의 차이점인가.
{ 차이점 }
1. 함수형은 데이터타입을 Table(struct 혹은 class) 이 아닌, Sum 과 Product, 재귀로 선언한다.
이는 데이터를 바라보는 관점의 차이이다.
Product가 곧 struct아니냐 할 수 있는데, Sum과 재귀는 크나 큰 차이이다.
객체지향이 객체라는 단어를 쓰는 시점에서 이부분은 차이가 난다.
함수형에서 데이터타입은 알고리즘과 닮는다. 따라서 이부분에서 알고리즘을 바라보는 자세도 차이가 난다.
2. 함수형은 공간에서 데이터를 읽고, 쓰지 않는다. 변수가 없다.
변수가 불변인게 아니다. 불변은 함수형을 객체지향으로 변환할때 오역하게 되는 것이고
실상 함수형은 변수가 없다. 함수형은 표현식에 이름을 붙인다.
공간에 데이터를 집어넣는게 아니라, 미해결된 표현식을 미해결상태로 alias 붙인다.
3. 함수형은 연산을 단 한번만 진행한다.
함수형은 여러연산을 하고싶을 경우, 연산을 체이닝한다.
이 말을 단순하게 서술하자면, 하스켈은 모나드의 bind를 통해 연산을 엮는다.
즉 함수형은 자바의 stream이 선택이 아닌 필수다.
함수형은 모든 연산이 스트림으로 진행된다.
이 세가지 차이점은, 객체지향의 발전 사항이 아니다.
대규모 코드처리, 다형성 처럼 무언가 추가되고 발전된 개념이 아닌,
아예 별개의 것이고 기존의 객체지향과 우열을 가릴 수 없다.
단지, 함수형이 자신의 문제를 해결하기 위해 채용한 테크닉들을
객체지향에 맞게 로컬라이즈시켜서 객체지향 언어들이 가져갔을 뿐이다.
저 세가지 차이점은 또한 객체지향과 함수형이 양립불가능하다는걸 의미하기도 한다.
정말 함수형을 공부하고 싶은 사람은,
앞의 저 세가지 차이점에 주목하고,
"아니 그러면 C로 하던걸 함수형은 어떻게 해?" 를 해결해보길 바란다.
답은 모나드다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
여기까지가 2023 4월 29일까지의 딱국생각.
하지만 내가 써놓고도 틀린점이 있다는걸 안다.
1. 함수형을 하스켈과 동일시 여기고 있음
리습은 함수형의시초격이지만 데이터타입이 없으므로 재귀적 데이터타입은 함수형을 나타내는 성질이 아닐수도 있다.
2. 스칼라는 객체지향과 함수형의 통합을 이루어냈다고 주장함.
그래서 나는 고의적으로 스칼라를 함수형공부의 최후방에 두었음.
사람들은 나보고 객지에 익숙한 스칼라로 입문하라고 했지만, 나는 그건 아예 잘못된 접근법이라고 생각.
내가 함수형을 공부하기로 마음먹은 이유는,
모든언어가 지네들이 함수형이라고 주장하는데 내 눈엔 전부 객체지향으로 보였기 때문임.
그러면 함수형의 퓨어한 구현체인 하스켈 너또한 객체지향이냐? 를 보고싶었음.
하스켈은 아예 뿌리부터가 달랐음.
스칼라를 접근할때 객체지향적으로 접근한다는것은.
스칼라를 그냥 코틀린처럼 쓰겠다는건데 난 그러기 싫었음.
난 스칼라를 1대 1 동등하게,
자바와 하스켈의 완벽한 중재자로 쓰고 싶음.
아니, 현재로선 그게 가능한 것인지를 의문품고있음.
솔직히 스칼라도 객체지향일까봐 두려움.
뭐 까봐야알겠지.
만약 스칼라가 두 철학을 융합했다?
오우 쉣 그럼 난 스칼라 정말 사랑할것임
긴글 읽어주셔서 감사합니다.
생각해보니, 생성자가 좀 이상해져서 그렇지,(아마 setter를 써야할듯) 객체지향도 재귀적인 타입선언은 가능하군. 그렇다면 Sum 타입만 함수형이 독특한점인가
sum 타입도 상속으로 구현 가능할것같고... 생각보다 객체지향이랑 함수형이 융합가능할지도
프갤로 꺼져 좀
왜캐화가남
살다살다 얘한테 도움을 받네. 자꾸 객체지향을 기준으로 함수형 개념을 생각하니까 진도가 안나가는거였네 배워간다.
근데 세가지 큰 차이를 써놨는데, 오카믈 공부해보니 하스켈이 좀 유별나긴 해도 아예 예외취급해버린 본문내용은 과장이 좀 있어요
2번차이 불변이 과장이 심한데, 함수형 변수를 불변이라고 해석해도 큰 무리 없는것같습니다. 오카믈을 보면 그래요. 근데 하스켈은, LAzyness랑 결합되어서, 변수가 진짜로 미해결 연산식으로서의 의미를 가지는데, 이게 미묘합니다. 기존 코딩방식을 아예 뒤흔드는 무언가에요. Lazyness가 엄청 큰 변화인데 본문에서 지연평가얘기를 안한것같아요
나 함수형 배워보고싶은데 하스켈 공부하면 됨?
하스켈 배우고 오카믈 보시면 이해가 잘됩니다
Haskell programming from first principle 이 책 보시는거 추천드립니다. 설명은 쉽되, 다루는 내용은 꽤나 많은 범위를 커버합니다. 반복, 자율성(앞에서 미리소개할때 자율적으로 감을 잡게 하고 나중에 뒤에 설명) 으로 학습시켜요. 책을 읽다보면 자연스럽게 자율학습을 하게 됩니다. 설명이 쉬워서 좋아요. 힌트얻기도 좋고
커리큘럼, 그니까 책이 다루는 내용이 좋습니다. 1200페이지, 영어 라서 좀 부담되긴 해요. 전 50일 정도 걸린것 같습니다.
제가 공부햬본 함수형이 오카믈, 하스켈인데 (오카믈은 거의 5일만에 책한권 다읽었음) 하스켈은 일종의 대수학입니다. 하스켈을 공부하면, 리스트, 옵셔널, Input Output, 상태, 튜플, 함수 라는 흔히 쓰는 데이터구조를 일반화 할 수 있습니다. 그리고 그 일반화 속에서, 이것들을 절차적으로, 또 안전하게 연산할 방법을 제공합니다
단점은 어렵다는거죠. 나는 그냥 옵셔널을 쓰고 싶은데, 옵셔널의 구조를 대수적으로 뜯어봐야합니다. (수학책을 보란뜻은 아니에요. 제가 소개드린 책 따라가면 됩니다) 이런걸 한번 증명하고 나서야 그 성질들을 자연스럽고 쉽게 쓸 수 있습니다. 한번 증명하는 과정이 고됩니다.
오카믈은 좀 더 자유로워요. 일단 하스켈은 연산을 절차적으로 실행하려면 >> 를 쓰는데요, 대충 모나드가 필요하다고 보시면 됩니다. 부작용이 모나드 안에 있어서 이런 일이 벌어집니다. 오카믈은, a다음 b 를 할때 ; 를 쓰는데, 첫번째 값을 버리고 두번째 값을 취합니다. a는 쓰이지 않는데도 연산해요. 부작용을 위해서
오카믈은 직관적이죠. 아, 저런 방식으로 연산을 엮으면 되겠구나. 오카믈이 데이터를 다루는 방식도 하스켈보단 일반화가 덜 돼있는데(제가 공부를 덜했을지도) 일단 모나드인 애들을 모나드밖에서 다루고 있으니, 사실 모나드로 이해가 가능한 부분을 오카믈에서는 개별사건으로 다루게 될 수도 있습니다.
결론 : 긴 여정을 떠나서 대수적 원리를 이해하려면 하스켈, 구현이나 기법에 초점을 맞출거면 오카믈. 추천드립니다