Functional Programming in C# [ Ch. 4, 5, 6 ] __ Oliver Sturm

Chap. 4. Flexible Typing with Generics [9/22]

제네릭 가능 : class, method, interface, delegate
대표적인 것 : 컨테이너 클래스.  다목적 베이스 클래스.

Generic Functions [9/22]

static void SomeThing<T> (T param) { // 함수 이름 뒤에 <타잎> 표시.
}
// Usage ..
SomeThing<int>(33);
SomeThing<string>(" The Parameter ");

<타잎> 변수 생략 가능 : 컴파일러 추론.

Generic Classes

..

Constraining Types 제한.

static void OutputVal<T> ( T value ) where T : ListItem<string> {}   // ListItem<string> 에서 파생되어야..

Other Generic Types

// Delegate
public delegate Rt SomeDelegate<T, Rt> (T param);  // Func<T, Rt> 와 같은 기능..
// Func
public delegate TResult Func<T1, T2, T3, T4, TResule> (T1 p1, T2 p2, T3 p3, T4 pr);
// 대부분의 추상 함수에 사용 가능.  4개 인수와 1개 리턴 값.
// Action 은 리턴 값이 없는 함수에 사용 가능.

Covariance and Contra variance

object[] objList = new object[3];
objList[2] = 10;
string[] strArr = new string[] { "one", "two", "thr" };
objList = strArr; // 이런 할당을 허용할 것인가..
// 좀 더 복잡한..
objList[2] = 10; // Runtime exception .. 어레이가 스트링 형이므로..
int[] intArr = new .... ;
objList = intArr; // intArr 는 밸류타입임.. 이 경우 covariance 는 레퍼런스 타잎만 지원

Variance 는 언어를 더 직관적으로 기능하게 하는 요소다.

List<object> objLst = new ...;
List<string> strLst = new ...;
objLst = strLst; // 허용 안됨.
// IEnumerable<T> 의 예.
public interface IEnumerable<out T> : IEnumerable { }  // retrieved from methods 에서 사용 가능. not passed into them.
IEnumeralbe<object> objSeq = new .. ;
IEnumeralbe<string> strSeq = new .. ;
objSeq = strSeq; // 가능.

4.0 에서 in, out 제레릭에서 사용 가능. 데이터 흐름의 방향을 제어 가능.

Chap. 5. Lazy Listing with Iterators

데이터를 효율적으로 다루기.

The Meaning of Laziness [9/23]

Linq 도 이같은 원리에 근거.

Enumerating Things with .NET

IEnumerable 인터페이스.
MoveNext(), Current(), Reset() …

Implementing Iterator Functions [9/24]

C# 2.0에서 도입된 IEnumerable / IEnumerator 조합을 이용. 제네릭, 넌제네릭 모두 가능.
특별한 형태의 리턴.  yield return 문.  Laziness ..  p49 코드를 볼 것.
리스트를 다 채우는 것이 아니라… 필요할 때 가져온다.. (미리 할 필요가 없다. 중간에 멈추면 후속 값 계산을 안 한다.).

Returning IEnumerator [9/29]

IEnumerable, IEnumerator ..

Chanining Iterators

.. laziness ..

.

Chap. 6. Encapsulating Data in Closures

Scope문제 Closure를 이용 해결.

Constructing Functions Dynamically [9/30]

C# 1.0 : ~ = C ..
delegate, event  : multicast
C# 2.0 : 무명함수.  함수를 만들어서 외부 스코프에 리턴하는 것은 이득이 많음.

The Problem with Scope

엄격한 스코프.
함수 플글에선 변하는 값을 별로 안 좋아함. 가이드 라인은 : { 변하는 값을 전혀 갖지 않음 }
가장 좁은 스코프 안에 집어 넣는 것.
순수 함수는 로컬 변수만 이용. 외부 참조 없음.   => 첫 반응은 incredulity.. 회의..
전역 변수가 않 좋은 이유 : 특정 시점에 어떤 값을 갖을 지 알 수 없음. ..
클래스 멤버는 좁은 스코프.
초기화 과정에서 나중에 쓰일 변수가 있다면 ?  클로져를 이용하는 대안..

How Closures Work

함수를 리턴하는 경우.. 그 안에 로컬 변수..  리턴 된 후 그 함수를 실행시키면 크래쉬. => 컴파일러가 그 값을 보관.
컴파일러는 무명 클래스를 생성하고 인스턴스 생성해서 그 함수를 부른 함수 내부에 둔다.
무명함수는 그 무명 클래스 내부의 함수로 생성. 그 콜러가 지속할 때까지 살아 있는다.  로컬 변수는 무명클래스의 필드로 된 것.
동적 함수는 객체 지향의 메서드 오버로딩과 유사. 하지만, 동적으로 생성됨.

Functional Programming in C# [ Ch. 1, 2, 3 ] __ Oliver Sturm

Chap. 1. A Look at Functional Programming History

What is Functional Programming ?

함수형 언어에서 Referential transparency 는 중요한 개념.  리턴 값이 입력 값에만 의존.
명령형 (imperative) 프로그래밍 과 대조.
함수형 언어 패러다임을 따르는 언어 : recursion 등 .. 을 쓰느냐..
-> 재귀 함수에서 스택에 위치해서 오버플로 하는 언어..  는 재귀를 쓰지 말아야.
고차 함수 : 함수를 인자로 받거나 리턴하는.
C에서는 무명 함수가 없다.
함수형 언어는 컴퓨터에서 문제를 푸는 방법을 알려주는 것. 일의 순서를 나열하는 것 보다는.. referential transparancy 는 이런 의미..

Functional Languages

Haskell, Erlang, Clojure.

The relationship to OOP

C#, F# .. albeit .

Chap. 2. Putting Functional Programming into a Modern Context

Concurrency Programming 에 의한 함수형 패턴 필요성.
Pararrel.foreach ..

Managing Side effects

Agile Programming Methodologies

함수 차원에서의 모듈화. 세분화된 작업을 할 때의 리팩토링. 클래스 차원에서는 너무 작업이 크다. ?

Declarative Programming

Funtional Programming is a Mindset

Is Functional Programming in C# A Good Idea?

Chap. 3. Functions, Delegates, & Lamda Expressions

Functions and Methods

C# 은 클래스 외에서의 함수는 인정 안함. => Methods 라 불림.

Reusing Functions

Anonymous Functions and Lambda Expressions

[sorting ] 비교 함수. 예.
[custom delegate ]

Func<object, object, bool> compareInt4 =
    (a, b) => ((int) a) > ((int) b);
Func<int, int, int> add = (x, y) => x + y;

람다 함수에서 var 사용 불가. 선언 시 타잎 추론 가능해야 함

Extension Methods [9/19]

Generic 도 가능.

Referential Transparency [9/21]

명령형 프로그램을 말할 때 대부분 ‘상태’ 에 관한 것이다.
명령형 프로그램의 주된 이슈중 하나는 코드가 점점 커진다는 점.
실행 순서에 촛점을 맞추므로 함수/메서드가 참조하기에 불투명해지는 경향이 있다. 같은 인수를 넣어도 동일한 결과가 나온다는 보장이 없다.
함수에서 사용하는 변수들이 여러 영역 (글로벌 .. )에서 가졍오기 때문.
RT 는 이와 반대. 이 단어는 어느 식에나 적용 가능하고, 프로그램을 바꾸지 않고 식이 값으로 바뀌어도 된다는 것.
수학에서 식은 항상 RT 하다. 즉, 3 + 2 는 5로 치환 가능하다.
어떤 함수는 RT 가 불가능. DateTime.Now, ReadByte 같은 것들. 특히 void 를 리턴하는 것들은 식으로 쓰일 수 없고, 참조적으로 불투명하다.
함수형 프로그램의 가장 중요한 컨셉중의 하나는 함수 구현에서 부작용을 피하는 것.
이것은 RT 와 매우 밀접한 관계이다. 순수한 함수는 인수로부터만 결과값을 만들어 부작용이 전혀 없는 것.
함수는 다른 함수를 부르거나 자신의 스코프 밖의 값을 사용할 수도 있다. PI 를 사용하는 예.

The general description of pure functions and side effects leaves out the perspective of the call site, from which a pure function can also be defined by saying that a call into a pure function is expected to be referentially transparent. 이 말이 정확하지는 않더라도  ..
순수한 함수를 쓰려면 인수만을 사용하고 끝에 리턴값을 리턴하라.  외부 변수에 접근하려면 그 일을 하는 다른 순수한 함수를 부르고.
실제 데이터요소에 접근하려면 그것이 상수 임을 확실히 하라. 이 조건에 맞지 않으면 부작용이다.
어떤 언어는 문법이 이를 불가능하게 함. 스크린에 뭘 출력하고 파일에 쓰는 것 들은 이 관점에서 모두 부작용임.

결과적으로 부작용을 피하는 것보다 더 중요한 것이 있다 : 부작용을 관리하는 것.  언어에 따라 이것이 쉽기도, 어렵기도.
순수한 함수를 쓰는 순수한 언어에서는 이를 회피하는 방법이 있다. 하스켈에서는 모나드가 이것을 가능하게 한다.
C#은 특별한 게 없다.  단지 아키텍쳐적인, 구조적인 문제일 뿐.

순수함수.. 마지막 말.
이렇게 코딩을 하면, 실행 순서, 함수가 불리는 순서는 중요하지 않다는 것.
개발자는 어떻게 함수들이 의존성의 네트웤을 형성하는 지 정의한다. 컴파일러가 최적의 실행을 한다.
이것은 최적화가 가능하게 하고, 중복된 코드는 자동제거될 수 있고, 캐시 적용가능하고, 로직파트는 병렬처리가 가능하다.
이런 가능성 리스트는 무한하고 많은 순수함수 환경은 이런 접근을 자동화한다.
충분한 이론-챕터가 나중에 이런 것들의 장점과 확장된 아이디어를 보여줄 것임.

닷넷 4.0 에서 code contracts 개념 도입.
PureAttribute.