![[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가 좀 특이하네