2009-04-28 2 views
7

나는 아직 F #을 grokked하지 않았다는 것을 인정한다. 그러나 30,000 피트 설명에서 그들은 가변 상태가없는 코드를 쉽게 테스트 할 수 있다고 계속 이야기하고 있습니다. 그것은 정적 메서드와 동일합니까?C#에서 더 많은 정적 메서드를 사용하여 함수 프로그래밍 (F #)과 동일한 이점을 얻을 수 있습니까?

일부 정적 코드를 모든 정적 메서드로 작성하여 F #의 이점을 얻을 수 있습니까?

나는 짧은 대답을 찾고 있는데, 나는 전체 책이 주제에 있다는 것을 알고있다.

답변

8

확실히 C# 코드를 쓸 수는 있지만 정적 함수와는 아무 관련이 없습니다. 불변의 것 (immutability)이란 구조체 나 객체가 "상태를 바꾼다"는 것입니다.

3

아니요, 정적 방법과 다릅니다. 초기화 된 후에 아무 것도 지정하지 않으면 (지역, 함수 인수, 정적 필드, 인스턴스 필드) 아무 것도 지정하지 않으면 가변 상태가되지 않습니다. 클래스를 변경할 수 없도록 디자인하면 몇 가지 이점을 얻을 수 있습니다.

8

절대적으로 아니오, 불변성은 정적 또는 인스턴스 인 메소드와 아무 관련이 없습니다. String은 변경 불가능한 클래스이므로 매우 기능적인 방식으로 무언가를 수정하는 대신 String 클래스의 새 인스턴스를 반환하는 인스턴스 메서드가 풍부합니다.

기능적 분해를 사용하여 F #을 에뮬레이트 할 수는 있지만 여전히 중요한 명령 코드입니다.

+0

흠. 다른 질문이 생깁니다. 이제 나는 S.O. 또한 기능적 분해 란 무엇입니까? – MatthewMartin

+0

모두 매우 간단합니다. http://en.wikipedia.org/wiki/Decomposition_(computer_science) –

+0

그냥 함수 (등)로 만든 함수를 사용하는 것이 좋은 디자인이라고 말합니다. 그것은 함수형 프로그래밍의 특징입니까, 아니면 둘 다 이름에 기능을 가지고 있습니까? – MatthewMartin

2

아니요, 두 개념은 서로 관련이 없습니다. C#의 정적 메서드는 들어오는 개체를 정상적으로 수정하고 ref 또는 out을 사용하여 다른 변수를 수정할 수 있습니다.

5

정적 인 기능 모듈과 객체를 제외하고 C# 3 및 lambdas, LINQ 등을 사용하여 F #의 이점을 얻을 수 있습니다. 그러나 그다지 멀지 않습니다. 내가 F 번호에 좋은 발견하는 것은 :

  • 쉬운 불변성을 사이
  • 쉬운 혼합

    • 추론 사방
    • 자동 일반화 (I 수동으로 분류 할 필요가 없습니다 유형 매개 변수에 추가)
    • 패턴 매칭
    • 중첩 함수 (경량) 판별 된 조합과 같은 모듈과 클래스
    • 유형
    • ,617,
    • 첫 번째 클래스 함수 (아니, C#의 이름이 대표는 포함되지 않습니다)
    • 모든 표현식을의
    • 쉬운 함수의 합성

    그래서, 당신은 C#으로이 중 일부를 수행하려고 할 수 있습니다. 일부는 지원되지 않으며 작동하지 않습니다. 나머지는 매우 못 생기고 매우 빠릅니다.

    그래서 LINQ와 Enumerable 확장의 길을 많이 벗어나면 아마도 고통의 세계로 끝날 것입니다.

  • 4

    나는 다른 모든 답변과 달랐습니다. 불변과 정적 메서드는 엄밀히 기술적으로 관련이있을 수는 없지만 F #을 사용하면 가능한 언제든지 C# 메서드를 정적으로 만드는 것이 좋습니다.

    생각은 아날로그이므로, 상태를 변경하는 것에 대해 걱정할 필요가 없으므로 변경 불가능한 개체를 처리하는 것이 더 쉽습니다. 같은 방식으로 정적 메서드를 사용할 때 상태에 대해 걱정할 필요가 없습니다 (글로벌 싱글 톤 또는 무언가를 사용하지 않는 한 ...).

    +0

    정적이 불변성을 나타 내기를 원하는 이유가 확실하지 않습니다. 예를 들어 x = y.gsub ('a', 'b') 대신 x = String.gsub (y, 'a', 'b')를 원하는 이유는 무엇입니까? 배우가 더 자주있는 것처럼 보이므로 정규 기능을 원합니다. 정적 함수는 일반적으로 x.cmp (y)보다 나빠지지 않는 String.cmp (x, y)와 같이 명확한 액터가 없을 때 발생합니다. 물론 예외가 있습니다. –

    +1

    전체적인 질문은 "이 방법으로 내가 예상 한 것을 신뢰할 수 있습니까?"입니다. 당신의 방법이 진정으로 기능적이라면, 그 결과는 단지 논쟁의 함수 일 뿐이며, 그것이 참조하는 다른 '외부'상태가 아닙니다. 이 경우 인수만으로 테스트를 수행하고 신뢰할 수있는 방법으로 간주 할 수 있습니다. 이런 의미에서 비 정적 클래스 내에서도 합리적으로 메서드를 정적으로 만들 수 있다면 그렇게 할 것입니다. – Benjol

    1

    사실입니다. C#에서 더 많은 정적 함수를 사용하면 함수 프로그래밍의 이점을 얻지 못할 것입니다. Howver, 만약 당신이 후드 (Reflector를 사용하여)를 보았다면, 나는 간단한 let 문이 정적 함수라는 것을 이해합니다. 즉,

    //F# 
    let a = 2 
    

    내가 혼란을 이해할 수

    //C# 
    static int a() 
    { 
        return 2; 
    } 
    

    C#에서 함수와 같다.

    설명 Leon Bambrick의 "F # Eye for C# Guy 프레젠테이션"에서 가져온 설명입니다.

    관련 문제