![[sweets lab/study/algorithm/resources/4. FP, FSharp.pdf]] ## FP의 특징 1: 순수 함수(Pure Function) 입력이 같으면 출력도 같음 ### Side Effect가 있는 함수 함수에 정의된 입출력이 아닌 counter를 활용해서 달라짐 ### 이 함수도 Side Effect가 있다고 할까요? side effect를 가짐. 왜? 함수의 출력이라는 건 함수가 '리턴'하는 걸 말함. 함수의 리턴값으로 나온 거 '이외에' 문자열로 출력이 되었다는 것. ## FP의 특징 2: 불면성(Immutability) 한 번 값이 binding 되면 변경할 수 없음. 1, 3번 줄 변수 선언할 때만 = 가 대입이고 =는 그냥 equals 보통 업데이트할 땐 <- 씀. 근데 그거 쓰면 mutable이 아니라 안 된다고 나옴 ## FP의 특징 3: 일급 함수(First-class Function) 함수를 1. 변수에 저장하거나 2. 인자로 전달하거나 3. 반환할 수 있음 1-3줄: 함수 선언 5번에서는 변수로 f = double이라고 해줌 그래서 f 1 하면 들어감..;; apply double 1... 10번은 그냥 기본 # 왜 함수형 프로그래밍이 좋나요? ## 코드의 품질이 높아집니다 - 간결 코드 (#3) - 안전한 리팩토링 (#1) - 적은 버그 (#1, #2) - 쉬운 테스트 (#1 -> 입력 생성하는 것만으로 테스트가 가능) # F#은 Strongly & Statically Typed Language! ## Type이 무엇일까요? 타입은 값의 범위 한적, 연산 한정시켜주는 것 # Weakly Typed & Strongly Typed ## Weakly: 정의되어 있지만, 형변환이 암묵적으로 허용 JS, C ## Strongly: 맞지 않은 type을 사용한 연산은 불가능 F#, Java # Statically Typed & Dynamically Typed ## Statically: 컴파일 되기 전에 타입 검사 F#, C, Java ## Dynamically: 실행될 때 타입 검사 Python, JS ## F# Type System 장점 1. 컴파일 타임에 버그 잡아 줌 2. 타입 추론으로 코드 간결 정리 가능 (4-6줄) ## Type으로 의도를 포함하기 (이거 한 번 더 보자) - 잘 정의한 타입을 통해 실제 구현 없이 프로그램의 **의도 파악**이 가능 # F#은 어떻게 사용할 수 있나요? ## 프로젝트 생성/빌드/실행 ```f# // 생성 dotnet new console -lang "F#" -o {프로젝트 이름} // 빌드 (Config: Debug/Release) dotnet build [-c <Config>] // 실행 dotnet run [-c <Config>] ``` # F# 기본 문법 ## 인자를 여러 개 받으면? 인자를 여러 개 받으면?....... 존나이상하네 ->를 여러개 붙이고 마지막에.... **Currying** ## 함수의 Currying이 적용되어 사용된 예 오 재밋당.... 사실상 1 -> (2 -> (3 -> ...)) 이라서 이게 말이 되는 것 ## unit에 대하여 argument가 없을 경우, 리턴값이 없을 경우 unit을 씀... 걍 자리를 ㅐ채워주는 역할. -> 기본적으로 side effect의 존재를 나타냄 뭘 안넣었는데 int가 나와. 뭔가 다른게있음. 아예 안쓸수는 없음. 40페이지 저런 6번은 왜뜨는거임?찾아봐야지; if 에는 Else 있어야함... 왜냐하면 없다 == unit타입. 한쪽이 그냥 unit이면 Else도 생략 가능. Tail Recursion이 잘 이해가 안되네 ... ㅇㅇ 가독성이 떨어진다고함 rec 적어줘야 함. **F#은 선언된 애들만 갖다 쓸 수 있음.** # 조금 더 강력한 F#의 기능을 알아볼까요? ## Type 정의하는 방법 type MyInt = int ## Tuble Type 정리 Tuple 수학적으로 집합의 곱이라 저렇게... Record는 약간 dictionary? 52번 내용은 51번 7번줄 내용 DU가 좀 특이하네