함수형 프로그래밍을위한 인수 [닫기]


10

나는 최근에 재미를 위해 F #을 배우고 있으며 (나는 VB.NET/C# dev), 나는 그것이 제공해야 할 것들을 정말로 좋아합니다. 이론적으로는. 그러나 C #이 아닌 F #으로 코딩하기로 선택한 시나리오를 생각하는 데 어려움을 겪고 있습니다. 어떤 아이디어?


2
F#함수형 프로그래밍을 완전히 대표하지는 않습니다. Clojure대신 시도하십시오 .
직업

1
F #을 모르지만 마음이 부러 질 때마다 Haskell을 사용합니다. 매번 일했다;)

1
infoq.com/presentations/Are-We-There-Yet-Rich-Hickey는 이 주제에 멋진 동영상을 (기능성 대 OO)입니다
mikera

역동적 인 기능 언어? 원하는만큼 가질 수 있습니다. : P
Erik Reppen

답변:



6

C #이 아닌 F #으로 코딩하기로 선택한 시나리오를 생각하는 데 어려움을 겪고 있습니다. 어떤 아이디어?

에서 여기 :

비동기 서버

  • 비동기 IO에 대한 비동기 워크 플로우.
  • 스레드 안전 메시지 전달을위한 사서함 프로세서
  • 서버 상태 및 메시지 카탈로그의 통합 유형
  • 상태 머신의 패턴 일치 및 테일 재귀

메타 프로그래밍 (예 : 파싱)

  • fslex 및 fsyacc와 같은 파서 생성기
  • FParsec과 같은 파서 결합기.
  • 우아한 수동 롤 파서를위한 액티브 패턴.
  • 구문 분석 트리를 나타내는 대수 데이터 형식입니다.
  • 트리를 조작하기위한 패턴 일치 (예 : 최적화 단계 적용)
  • 빠른 코드의 런타임 생성을위한 반영.

기술 컴퓨팅

  • 우아하고 빠른 알고리즘 코드를위한 고차 함수.
  • 기호 조작을위한 대수 데이터 유형 및 패턴 일치
  • 풍부한 .NET 라이브러리에 대한 상호 운용성
  • F # 대화식을 사용한 대화 형 기능.
  • 데이터 마사지를위한 계산식.
  • 정확성 향상을위한 측정 단위.

GUI 어플리케이션

  • 사용자 인터페이스 코드와 응용 프로그램 논리 코드간에 전달되는 비동기 메시지로 모델링합니다.
  • 고차 함수를 사용하면 사용자 인터페이스를 선언적으로 정의 할 수 있습니다.

논리 프로그래밍

  • 손쉬운 역 추적을위한 영구 컬렉션.
  • 테일은 신뢰성을 요구합니다.
  • 쉬운 일반 프로그래밍을위한 자동 일반화.

테스팅

  • 대화식으로 단위 테스트를 실행하십시오.
  • BDD는 통역사 작성을 의미합니다.
  • 테스트 장치를 작성하고 결과를 시각화하는 데 유용한 스크립팅 언어입니다.

공연

  • inline 무료 고차 추상화 용.
  • 테일은 빠른 상태 머신을 요구합니다.
  • 낮은 대기 시간을위한 순전히 기능적인 데이터 구조.
  • 최적화 된 코드 생성을위한 메타 프로그래밍.

나는 F #이나 C #을 모른다는 것을 인정하지만 F #에서 며칠을 보내고 당신의 생각을 보는 것이 좋습니다. REPL을 사용하는 것이 그것을 지원하는 모든 언어에서 가장 큰 승리라고 생각합니다.
Zachary K

5

다음은 거의 매일 기능적 프로그래밍을 사용하는 것입니다.

우리는 상당히 큰 데이터 세트로 많은 통계 및 계리 작업을 수행합니다. 데이터베이스에서 가져온 데이터는 본질적으로 정적이며 변경 불가능한 객체입니다. 메서드를 사용하여 클래스를 만들 이유가 없습니다.

계산의 각 단계는 몇 가지 추가 세부 정보를 추가하지만 본질적으로 객체를 변경하지는 않습니다. 파이프 라인의 "끝"에서 우리는 합과 수를 계산하기 위해 실제로 축소 작업을 수행하고 있습니다.

이것을 상상해보십시오.

for data in summarize( enrich( calculate( some_query( criteria() ) ) ) ):
    print data

계산의 각 "단계"는 간단한 읽기 계산 수율을 수행하고 다른 사물과 결과의 복합 객체를 생성하는 기능적 프로그래밍 루프입니다.

(우리는 Python을 사용하므로 생성기 함수를 사용하는 함수형 프로그래밍입니다.)

상태 비 저장 불변 개체를 사용하는 것이 더 쉽습니다.


파이썬은이 F #과 동등합니까? criteria() |> some_query |> calculate |> enrich |> summarize순방향 파이프 연산자가 더 명확한 코드로 이어질 수 있지만 나는 멀어집니다.
ChaosPandion

@ ChaosPandion : 첫째, 그 구문은 나를 혼란스럽게합니다. 그러나 어떤 사람들은 그것을 좋아하는 것 같습니다. 수많은 파이썬 패키지가 있습니다. SO에서 검색하여 답을 찾을 수 있다고 확신합니다.
S.Lott

@ 차오스 : 내가 아는 것은 아닙니다. 보통 나는 map같은 효과를 내기 위해 작성 합니다.
Paul Nathan

4

기술적으로는 함수형 프로그래밍의 고유 한 속성이 아니며 F #은 순수한 함수형 언어가 아닙니다. ML 자손 중 하나 인 F #은 탁월한 패턴 일치 및 대수 데이터 형식을 제공합니다. 따라서 복잡한 데이터 구조가 필요한 모든 작업에 대해 F #은 C #보다 훨씬 표현적이고 사용하기 쉽습니다.

C #과 F #에서 컴파일러를 구현한다고 상상해보십시오. 추상 구문 트리를 나타내고 변환하면 언어에서 ADT와 패턴 일치를 제공하는 경우 훨씬 간단 해집니다.


2

맵 축소 형 대규모 다중 시스템 및 대규모 다중 코어 병렬 처리에 적합합니다. 오늘날 엔트리 레벨 서버에는 48 개의 코어 (96 개의 HT 계산)가 제공된다는 점을 고려하면 매우 멋집니다.


2

완전한 기능을 갖춘 Haskell을 원한다면 Erlang에는 멋진 기능도 있습니다.

Simon Payton-Jones는 Haskell에 대해 말했습니다. 그는 명백한 버그가 아닌 버그가없는 프로그램을 원합니다.

(아마 인용구를 약간 벗어 났지만 아이디어를 얻었습니다.)

부작용을 제한함으로써 코드의 정확성을 훨씬 쉽게 증명할 수 있습니다.


1

확실한 장점 중 하나는 훨씬 더 쉽게 병렬화된다는 것입니다.


2
당신은 순도에 대해 이야기하고 있으며 명백한 단점은 순도는 프로그램을 훨씬 느리게 만드는 경향이 있다는 것입니다. 따라서 병렬 + 순수가 반드시 좋은 것은 아닙니다.
Jon Harrop 2019
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.