F# 5 : 기능적 프로그래밍의 새로운 시대 .그물
요약:
1. F# 5는 F# 언어의 다음 주요 버전입니다.
2. F# 5는 현재 시대의 끝과 새로운 시대의 시작을 나타냅니다.
삼. F# 5는 대화식 프로그래밍, 분석 지향 프로그래밍 및 기능 프로그래밍에 중점을 둡니다.
4. F# Interactive (FSI)는 반복 및 대화식 개발을 위해 개발 된 도구입니다.
5. F# 5는 참조 및 호출 어셈블리를 포함하여 FSI의 핵심 경험을 유지합니다.
6. 패키지 관리 지원이 FSI에 도입되어 Nuget 패키지를보다 쉽게 참조 할 수 있습니다.
7. F# 5 이제 F# 스크립트에서 Nuget 패키지 참조를 지원합니다.
8. FSI는 패키지의 모든 어셈블리를 자동으로 복원하고 참조합니다.
9. F# 5는 DotNet FSI를 소개하여 MacOS 및 Linux에서 FSI를 사용할 수 있도록합니다.
10. F# 지원은 대화식 프로그래밍을 위해 Jupyter 노트북에 추가됩니다.
독특한 질문 :
1. F# 5는 무엇입니까??
답변: F# 5는 F# 언어의 다음 주요 버전입니다.
2. f# 5는 무엇을 끝내 든다?
답변: F# 5는 현재 시대의 끝을 표시합니다.
삼. F# 5의 세 가지 주요 초점 영역은 무엇입니까??
답변: F# 5의 3 가지 주요 초점 영역은 대화식 프로그래밍, 분석 지향 프로그래밍 및 기능 프로그래밍입니다.
4. F# Interactive (FSI) 란??
답변: FSI는 F#을 사용하여 반복 및 대화식 개발을 위해 개발 된 도구입니다.
5. F# 5는 FSI에서 유지하는 경험이 무엇입니까??
답변: F# 5는 참조 및 호출 어셈블리를 포함하여 FSI의 핵심 경험을 유지합니다.
6. FSI의 패키지 관리 지원은 무엇을 허용합니까??
답변: FSI의 패키지 관리 지원은 F# 스크립트에서 Nuget 패키지를보다 쉽게 참조 할 수 있습니다.
7. F# 5는 NUGET 패키지 참조를 어떻게 지원합니까??
답변: F# 5는 F# 스크립트에서 NUGET 패키지를 참조 할 수 있으며 FSI는 패키지의 모든 어셈블리를 자동으로 복원하고 참조합니다.
8. Dotnet FSI는 무엇입니까??
답변: Dotnet FSI는 MacOS 및 Linux에서 FSI를 사용할 수 있도록하는 명령입니다.
9. 대화식 프로그래밍을 위해 추가 지원이 F# 5를 소개합니다?
답변: F# 5는 대화식 프로그래밍을위한 Jupyter 노트북에서 F# 지원을 소개합니다.
10. F#의 대화식 프로그래밍이 최근에 어떻게 변경 되었습니까??
답변: F#의 대화식 프로그래밍은 Jupyter Notebooks의 패키지 관리, Dotnet FSI 및 F# 지원으로 확장되었습니다.
11. F# 1의 중요성은 무엇입니까?.0 및 FSI?
답변: F# 1.0은 F# 언어의 초기 릴리스였으며 FSI (F# Interactive)는 대화식 개발을 위해 이와 함께 개발되었습니다.
12. 현재 FSI를 사용할 수있는 플랫폼은 무엇입니까??
답변: FSI는 이제 Windows 외에 MacOS 및 Linux에서 사용할 수 있습니다.
13. F# 5가 패키지 관리를 더 쉽게 만드는 방법?
답변: F# 5 Nuget 패키지를 쉽게 참조하고 조립품을 자동으로 처리하여 패키지 관리를 단순화합니다.
14. Dotnet FSI의 목적은 무엇입니까??
답변: Dotnet FSI.
15. F# 5는 다른 유형의 패키지를 어떻게 인식하고 처리합니까??
답변: F# 5는 FSI에서 특정 어셈블리 참조 순서가 필요한 기본 의존성 및 패키지를 갖춘 패키지를 처리 할 수 있습니다.
F# 프로그래밍 언어 : 역사, 혜택 및 미래 가능성
여러 항목
유형 예외 =
새로운 : 단위 -> 예외 + 2 과부하
회원 데이터 : Idictionary
회원 getBaseexception : 단위 -> 예외
멤버 getObjectData : 정보 : SerializationInfo * 컨텍스트 : StreamingContext-> Unit
회원 gettype : unit-> 유형
멤버 helplink : get, set과 함께 문자열
멤버 innerexception : 예외
멤버 메시지 : 문자열
회원 출처 : get, set과 함께 문자열
멤버 스택 트레이스 : 문자열
.
F# 5 : 기능적 프로그래밍의 새로운 시대 .그물
Microsoft의 F# 팀에서 우리는 개발자가 기능 프로그래밍을 수행 할 수 있도록 F# 언어를 지속적으로 개선하고 있습니다 .그물. 2017 년부터 지금까지 4 번의 릴리스를 통해 우리는 F#을 굉장하게 만들기 위해 오랜 여행을 해왔습니다 .순 코어. 우리는 F# 컴파일러 및 핵심 라이브러리를 개선하여 크로스 플랫폼을 실행하고 스팬 및 저수준 크로스 플랫폼 프로그래밍에 대한 지원을 추가했으며 함께 배송 할 수있는 언어 기능을 미리 볼 수있는 기능을 추가했습니다 .순 미리보기 릴리스.
와 더불어 .NET 5 릴리스, 우리는 F# 5, 다음 주요 버전의 F# 5를 출시하고 있습니다. 그러나 F# 5는 .순 5. F# 5는 현재 시대의 끝을 표시합니다 ? 지원을 제공합니다 .순 코어 ? 그리고 새로운 것의 시작. F# 5를 사용하면 F#을 가져 오는 여정을 고려하고 있습니다 .순 코어는 대부분 완료됩니다. F# 5를 사용하면 초점이 이동합니다 .세 가지 주요 영역으로의 순 코어 :
- 대화식 프로그래밍
- 분석 지향 프로그래밍을 편리하고 재미있게 만듭니다
- 기능 프로그래밍을위한 훌륭한 기본 및 성능 .그물
이 기사에서는 F# 5를 위해 구현 한 F# 언어 및 툴링 기능을 살펴보고 목표와 어떻게 조정하는지 설명하겠습니다.
F# 5는 대화식 프로그래밍을 기쁨으로 만듭니다
F#은 대화식의 오랜 역사를 가지고 있습니다. 실제로 F# 1 일 때.0은 개발되었으며 F# Interactive (FSI)라는 도구가 F# 1의 최종 릴리스를 위해 개발되었습니다.2006 년 0. 이것은 Visual Studio 로의 첫 번째 툴링 통합과 일치했습니다. FSI는 F#의 초기 마케팅에 상당히 많이 사용되었습니다 ( 그림 1) Windows에서 Windows Forms Applications, 그래픽 장면 및 게임의 반복 및 대화식 개발을 보여주기 위해 Windows.
FSI의 핵심 경험은 F# 5에서 크게 동일하게 유지되었습니다. 여기에는 다음이 포함됩니다
- 컴퓨터의 어셈블리를 참조하고 호출하는 기능
- 다른 F# 스크립트를로드하여 스크립트 모음으로 실행하는 기능
- Visual Studio와의 통합
- 출력을 사용자 정의하는 기능
그러나 f#과 .Net Ecosystem은 컴퓨터의 어셈블리에서 패키지 관리자를 통해 설치된 패키지로 이동했으며, 다양한 작업에 FSI를 사용하는 많은 F# 개발자. 또한, AS .Net ‘s Reach는 Windows 너머로 확장되었으며 MacOS 또는 Linux의 개발자는 자신의 기능이 누락 된 기능을 발견하고 모노 설치에 의존하여 환경에서 FSI를 사용했습니다.
FSI에서 패키지 관리 지원 소개
F# 스크립트에서 패키지 사용은 오랫동안 F# 프로그래머에게 좌절의 원인이되었습니다. 그들은 일반적으로 패키지 자체를 다운로드하고 패키지 경로에서 수동으로 참조 된 어셈블리를 다운로드했습니다. 더 작은 F# 프로그래머 세트가 파케 패키지 관리자 및 생성 a “로드 스크립트” ? 참조하려는 패키지의 모든 어셈블리에 대한 참조가 포함 된 F# 스크립트 파일을 생성하는 Paket의 기능 ? 이 스크립트를 작업 F# 스크립트에로드합니다. 그러나 Paket은 기본 도구 대신 Nuget의 대안이므로 대부분의 F# 프로그래머는 사용하지 않습니다.
이제 F# 5를 사용하면 F# 스크립트에서 Nuget 패키지를 참조 할 수 있습니다. FSI는 Nuget 으로이 패키지를 복원하고 패키지의 모든 어셈블리를 자동으로 참조합니다. 예는 다음과 같습니다
#R "Nuget : NewTonsoft.JSON "Open NewTonsoft.JSON은 O =를 보자 <| X = 2; Y = "Hello" |>printfn "%s"(jsonconvert.SerializeObject o)
해당 스 니펫에서 코드를 실행하면 다음 출력이 표시됩니다
Val O : <| X: int; Y: string |>= < X = 2 Y = "Hello" >val it : unit = ()
패키지 관리 기능은 당신이 던지고 싶은 모든 것을 처리 할 수 있습니다. ML과 같은 기본 종속성을 가진 패키지를 지원합니다.그물 또는 뒤집기. 또한 FPARSEC와 같은 패키지를 지원하는데, 이전에는 패키지의 각 어셈블리가 FSI에서 특정 순서로 참조해야했습니다.
도트 넷 FSI 소개
FSI를 사용하는 F# 프로그래머의 두 번째 주요 좌절은 .오랫동안 순 코어. Microsoft는 초기 버전의 FSI를 출시했습니다 .Net Core와 .순 코어 3.0이지만 종속성을 포함하지 않은 F# 스크립트에만 유용했습니다. 이제 패키지 관리와 함께 Windows에서와 마찬가지로 MacOS 또는 Linux에서 동일한 작업에 FSI를 사용할 수 있습니다 (명백한 이유로 WinForms 및 WPF 앱을 시작하는 제외). 이것은 단일 명령으로 수행됩니다 : dotnet fsi .
Jupyter 노트북에 F# 지원을 소개합니다
패키지 관리 및 FSI를 어디에서나 사용할 수있게 만드는 데 의문의 여지가 없습니다. 그러나 Microsoft는 우리가 그 이상을 할 수 있다고 생각했습니다. 최근 몇 년 동안 Python 커뮤니티에서 대화식 프로그래밍이 폭발했습니다. Jupyter Notebooks 덕분. F# 커뮤니티는 몇 년 전 Jupyter에서 F#에 대한 초기 지원을 구축 했으므로 현재 관리자와 함께 Jupyter의 좋은 경험이 무엇을 의미하고 구축했는지에 대해 알아 냈습니다.
이제 F# 5를 사용하면 패키지를 뽑고 데이터를 검사하며 실험 결과를 공유 가능한 크로스 플랫폼 노트북에서 다음과 같이 읽고 조정할 수 있습니다 그림 2.
Jupyter Notebooks의 F# 지원에 대해 매우 흥분하는 또 다른 이유는 노트북이 다른 사람들과 쉽게 공유하기 쉽기 때문입니다. Juputer 노트북은 Github 및 기타 환경에서 Markdown 문서로 렌더링됩니다. 그들은 프로그래밍 도구 일뿐 만 아니라 다른 사람들에게 작업을 수행하고, 결과를 공유하고, 라이브러리를 배우거나, F# 자체를 배우는 방법을 지시하는 데 사용할 수있는 문서를 제작합니다!
Visual Studio Code Notebook에서 F# 지원 소개
F# Jupyter Notebooks의 지원은 완전히 새로운 차원의 상호 작용을 제공합니다. 하지만 Jupyter는 노트북을위한 유일한 방법이 아닙니다. Visual Studio Code는 또한 일반 파일에서 코드를 편집 할 때 찾을 것으로 예상되는 언어 서비스의 모든 힘과 함께 노트북 프로그래밍을 접는 것입니다. Visual Studio Code Notebooks의 F# 지원을 통해 다음과 같이 노트북을 작성할 때 언어 서비스 통합을 즐길 수 있습니다 그림 3.
Visual Studio Code Notebooks의 또 다른 이점. Jupyter 노트북 수입 및 Visual Studio Code Notebooks를 Jupyter Notebooks로 내보내는 것을 지원합니다 그림 4.
Visual Studio Code 및 Jupyter Notebook에서 F#로 많은 일을 할 수 있으며 지금까지 설명 된 것 이상의 기능을 확장하려고합니다. 로드맵에는 다양한 다른 도구와의 통합,보다 응집력있는 데이터 시각화 및 Python과의 데이터 인터 로프가 포함됩니다.
F# 5는 분석 프로그래밍을위한 더 많은 기초를 선보입니다
유비쿼터스 머신 러닝 시대의 중요성이 커지는 패러다임 및 데이터 과학은 제가 부르는 것입니다 “분석 프로그래밍.” 이 패러다임은 새로운 기술, 라이브러리 및 프레임 워크가 매일 나오지만 공간을 더욱 발전시킵니다. 분석 프로그래밍은 데이터 분석 및 조작에 관한 것입니다. 일반적으로 수치 기술을 적용하여 통찰력을 제공합니다. 이는 CSV 가져 오기 및 데이터의 선형 회귀 분석을 AI 연구 기관에서 나오는 가장 진보되고 컴퓨팅 집약적 인 신경망으로 계산하는 것입니다.
F# 5는이 공간으로의 우리의 시작을 나타냅니다. Microsoft의 팀은 F#가 F#을 정확히 사용하여 정확히 해당 목적으로 사용하여 F#가 이미 데이터 조작에 적합하다고 생각합니다. F#은 또한 일부 내장 유형 및 기능 및 접근 가능하고 간결한 구문을 갖춘 숫자 프로그래밍을 잘 지원합니다. 그래서 우리는 그것을 염두에두고 개선 할 더 많은 영역을 확인했습니다.
슬라이스로 일관된 동작
분석 프로그래밍에서 수행되는 매우 일반적인 작업은 데이터 구조, 특히 배열을 취하는 것입니다. F# 슬라이스는 일관되지 않게 행동하는 데 사용되는 슬라이스, 일부는 외부 외 거동과 함께 런타임 예외를 초래하고 다른 일부는 빈 슬라이스를 초래합니다. F# 내재 유형 (배열, 목록, 문자열, 3D 어레이 및 4D 어레이에 대한 모든 슬라이스를 변경하여 존재할 수없는 슬라이스에 대한 빈 슬라이스를 반환했습니다
L = [1..10] a = [| 1..10 |] s = "안녕하세요!"// 이전 : 빈 목록 // f# 5 : 동일하게 emptylist = l.[-2..(-1)] // 이전 : 예외를 던질 것입니다 // f# 5 : 빈 배열을 emptyArray = a.[-2..(-1)] // 이전 : 예외를 던질 것입니다 // f# 5 : empty string letystring = s.[-2..(-1)]
이에 대한 추론은 주로 F#에서 빈 조각이 비어 있지 않은 슬라이스로 구성되기 때문입니다. 빈 문자열은 비어 있지 않은 문자열에 추가 할 수 있고 빈 배열은 비어 비어있는 배열 등에 추가 될 수 있습니다. 이 변화는 깨지지 않으며 행동의 예측 가능성을 허용합니다.
3D 및 4D 어레이의 고정 인덱스 슬라이스
F#에는 3D 및 4D 어레이에 대한 내장 지원이 있습니다. 이 배열 유형은 항상 슬라이싱 및 인덱싱을 지원했지만 고정 인덱스를 기준으로 슬라이스하지 않습니다. F# 5를 사용하면 이제 가능합니다
// 먼저, 0에서 7까지의 값이있는 3D 배열을 만듭니다 = DIM = 2 let m = array3d.0에서 z에 대해 zerocreate dim dim dim let mutable cnt = 0 in 0..Dim-1은 0에서 Y에 대해 수행합니다..Dim-1은 0에서 x에 대해 수행합니다..dim-1 do m.[X, Y, Z]
이것은 3D 및 4D 어레이로 시나리오를 슬라이싱하기위한 그림을 완성하는 데 도움이됩니다.
미리보기 : 반전 인덱스
Microsoft는 또한 F# 5의 미리보기로 슬라이스와 함께 사용할 수있는 리버스 인덱스를 사용할 수있는 기능을 도입하고 있습니다. 그것을 사용하려면 간단히 배치하십시오
xs = [1..10] // 끝에서 요소 1 가져 오기 : XS.[^1] // 마지막 두 요소를 얻는 오래된 방법은 lasttwooldstyle = xs를하자.[(xs.길이 -2)..] // 마지막 두 요소를 얻는 새로운 방법은 LOASTWONEWSTYLE = XS를하자.[^1..] lasttwooldstyle = lasttwonewstyle // true
또한 F# 유형 확장을 통해 자신의 멤버를 정의하여 이러한 유형을 확대하여 F# 슬라이싱 및 리버스 인덱스를 지원합니다. 다음 예제는 스팬 유형과 함께합니다
멤버 sp.getSlice (startIdx, endidx) = s = defaultarg startIdx 0 let e = defaultarg endidx sp.길이 sp.슬라이스 (S, E -S) 회원 SP.getReverseIndex (_, 오프셋 : int) = sp.길이 - 오프셋 let sp = [| 1; 2; 삼; 4; 5 |].asspan () sp.[의 뜻..^2] // [| 1; 2; 3 |]
F# 내재 유형에는 리버스 인덱스가 내장되어 있습니다. F#의 향후 출시에서 우리는 또한 시스템과의 전체 인터 로프를 지원합니다.색인 및 시스템.범위, 어떤 시점에서, 기능은 더 이상 미리보기에 있지 않습니다.
향상된 코드 견적
F# 코드 따옴표는 F# 코드의 구조를 조작하고 선택한 환경에서 평가할 수있는 메타 프로 그램 기능입니다. 이 기능은 AI 모델이 GPU와 같은 다른 하드웨어에서 실행될 수있는 기계 학습 작업을위한 모델 구성 언어로 F#을 사용하는 데 필수적입니다. 이 퍼즐에 누락 된 중요한 부분은 일반적인 산술에 사용 된 것과 같은 F# 유형 제약 정보를 충실히 표현할 수있는 능력, F# 인용문에서 평가자가 평가하는 환경에 이러한 제약 조건을 적용하도록 알 수 있도록합니다.
F# 5로 시작하여 이제 제약 조건이 코드 견적에 유지되어 DiffSharp와 같은 특정 라이브러리가 F# 유형 시스템 의이 부분을 사용하여 유리하게 사용할 수있는 기능을 잠금 해제합니다. 이를 입증하는 간단한 방법은 다음 코드입니다
열린 fsharp.LINQ.runtimeHelpers는 평가 Q = LeafexpressionConverter를 허용합니다 .평가 Quotation q는 x = -x // 결정적으로 '부정'이 // 다음 시그니처를 가지고 있습니다 : // // val inline 부정 : // x : ^a -> ^a // ^a : // (~ -) : ^a -> ^a) / ^a) / ^a) / ^a) . |> 평가
산술 연산자의 사용은 부정하기 위해 전달 된 모든 유형이 ? 운영자. 코드 견적 이이 제약 정보를 유지하지 않기 때문에이 코드는 런타임에 실패하므로 평가하면 예외가 발생합니다.
코드 따옴표는 AI 모델을 만드는 언어로 f#을 사용하기 위해 더 많은 R & D-Heavy 작업을위한 기초이며, 따라서 유형 제약 정보를 유지하는 능력은 F#이 자신의 삶에서 조금 더 유형의 안전을 추구하는이 공간의 프로그래머를위한 매력적인 언어로 만드는 데 도움이됩니다.
F# 5는 큰 기본 사항을 가지고 있습니다
F# 5는 상호 작용과 분석 프로그래밍을 더 좋게 만드는 것일 수 있지만, 그 핵심에서 F# 5는 여전히 F# A Joy에서 일상 코딩을 만드는 것입니다. F# 5에는 앱 개발자와 도서관이 즐길 수있는 몇 가지 새로운 기능이 포함되어 있습니다.
이름에 대한 지원
첫 번째 Up은 C# 개발자가 좋아하는 기능입니다 : nameof . 연산자 이름은 f# 기호를 입력으로 가져 와서 해당 기호를 나타내는 컴파일 타임에 문자열을 생성합니다. 거의 모든 F# 구성을 지원합니다. 운영자 이름은 종종 실행중인 응용 프로그램에서 진단을 기록하는 데 사용됩니다.
#R "Nuget : Fsharp.SystemTextJson "오픈 시스템.텍스트.JSON 오픈 시스템.텍스트.JSON.직렬화 오픈 시스템.실행 시간.compilerservices 모듈 m = f x = nameof x printfn "%s"(m.f 12) printfn "%s"(m) printfn "%s"(m nameof m.f) /// EventStore의 API 유형의 단순화 된 버전 RecordedEvent = < EventType: string Data: byte[] >/// 내 콘크리트 유형 : type myevent = | int | string의 bdata // 매치 표현식에서 문자열 문자 대신 'nameof'를 사용합니다.이벤트 타입 | Adata의 이름 -> jsonserializer.사제 e.데이터 |> ADATA | bdata의 이름 -> jsonserializer.사제 e.데이터 |> bdata | t-> 실패한 이벤트 유형 : %s "t
보간 된 현
다음은 C# 및 JavaScript : 보간 문자열과 같은 언어로 표시되는 기능입니다. 보간 된 문자열은 F# 표현식으로 채울 수있는 문자열로 보간 또는 구멍을 만들 수 있습니다. F# 보간 문자열 지원 유형 보간 보간은 동일한 형식과 동의어 Sprintf 및 Printf 문자열 형식에 지정됩니다. F# 보간 문자열은 또한 트리플 퀘스트 문자열을 지원합니다. C#에서와 마찬가지로 F# 보간의 모든 기호는 탐색 가능하고 이름이 바뀔 수 있습니다.
// 기본 보간 문자열 let name = "phillip"let age = 29 let message = $ "이름 : "" ""이름 ":" ","age ":" ""
또한 보간 문자열 내에 여러 표현식을 작성하여 기능에 대한 입력에 기초하여 보간 된 표현식에 대해 다른 값을 생성 할 수 있습니다. 이것은 기능의 틈새 사용이지만, 보간은 유효한 F# 표현 일 수 있으므로 많은 유연성을 허용합니다.
오픈 유형 선언
F#은 항상 공개 구조를 노출시키기 위해 네임 스페이스 또는 모듈을 열 수있었습니다. 이제 F# 5를 사용하면 정적 방법, 정적 필드, 정적 특성 등과 같은 정적 구조물을 노출시키기 위해 모든 유형을 열 수 있습니다. F# 노조 및 기록도 열 수 있습니다. 특정 유형 인스턴스화에서 일반 유형을 열 수도 있습니다.
오픈 타입 시스템.수학 x = min (1.0, 2.0) 모듈 m = type du = a | B | C Some Otherfunction x = x + 1 // 모듈 내부의 유형 만 열기.du printfn "%a"a
향상된 계산 표현
계산 표현식은 라이브러리 저자가 표현 코드를 작성할 수있는 잘 사랑받는 기능 세트입니다. 카테고리 이론에 정통한 사람들의 경우, 그들은 또한 모나 딕 및 모노이드 계산을 작성하는 공식적인 방법이기도합니다. F# 5는 두 가지 새로운 기능으로 계산 표현을 확장합니다
- LET를 통한 계산 표현에 대한 적용 양식. 그리고! 키워드
- 오버로드 사용자 정의 작업에 대한 적절한 지원
“계산 표현식에 대한 적용 양식” 약간의 입 이요. 카테고리 이론으로의 다이빙을 피하고 대신 예를 들어 작업 할 것입니다
// 먼저, 'zip'기능 모듈 결과를 정의합니다. OK X1RES, OK X2RES-> OK (X1RES, X2RES) | 오류 E, _-> 오류 E | _, ERROR E-> ERROR E // 다음, 다음, 'MERGESORCES'및 'bindreturn'유형 resultBuilder () = member _로 빌더를 정의하십시오.mergesources (t1 : result, t2 : result) = 결과.지퍼 T1 T2 멤버 _.bindreturn (x : result, f) = 결과.map f x let ret = resultbuilder () let r1 r2 r3 = // 여기에 우리의 응용 프로그램이 있습니다! res1 : result = result를 보자 < let! a = r1 and! b = r2 and! c = r3 return a + b - c >| OK x-> printfn " %s Is : %d"(nameof res1) x | 오류 e-> printfn " %s is : %s"(nameof res1) e
F# 5 이전에는 이들 각각과! 키워드가 허용되었을 것입니다! 키워드. 및! 키워드는 다음 표현이 100% 독립적이어야한다는 점에서 다릅니다. 이전 LET의 결과에 의존 할 수 없습니다! -바운드 값. 즉, 다음과 같은 코드가 컴파일하지 못하는 것을 의미합니다
res1 : result = result를 보자 < let! a = r1 and! b = r2 a // try to pass 'a' and! c = r3 b // try to pass 'b' return a + b - c >
그래서 왜 우리는 그 코드가 컴파일하지 못하게할까요?? 몇 가지 이유. 첫째, 컴파일 타임에 계산 독립성을 시행합니다. 둘째, 컴파일러가 통화 그래프를 정적으로 구축 할 수 있기 때문에 런타임에 약간의 성능을 구매합니다. 셋째, 각 계산은 독립적이므로 실행중인 환경에 의해 병렬로 실행될 수 있습니다. 마지막으로, OK 값 대신 오류 값을 반환 할 수있는 이전 예제와 같이 계산이 실패하면 모든 것이 해당 실패에 대해 단락되지 않습니다. 적용 양식 “모으다” 모든 결과 값과 마무리 전에 각 계산이 실행되도록합니다. 당신이 각각을 교체한다면! let와 함께! , 오류를 반환 한 내용으로 단락이 발생했습니다. 이 다른 행동은 도서관 저자와 사용자가 시나리오에 따라 올바른 행동을 선택할 수 있습니다.
이것이 조금 더 개념이 무거운 것 같으면 괜찮습니다! 적용 계산은 라이브러리 저자의 관점에서 나온 약간의 고급 개념이지만 추상화를위한 강력한 도구입니다. 그들의 사용자로서, 당신은 그들이 어떻게 작동하는지에 대한 모든 내용을 알 필요가 없습니다. 계산 표현식의 각 계산이 다른 계산이 다른 계산이 보장된다는 것을 간단히 알 수 있습니다.
계산 표현식에 대한 또 다른 향상은 동일한 키워드 이름으로 사용자 정의 작업에 대한 과부하, 선택적 인수 지원 및 시스템 지원을 적절히 지원할 수 있다는 것입니다.Paramarrray 주장. 사용자 정의 작업은 라이브러리 저자가 계산 표현식에서 발생할 수있는 자신의 작업 종류를 나타내는 특수 키워드를 지정하는 방법입니다. 이 기능은 토성과 같은 프레임 워크에 많이 사용되어 웹 앱을 구축하기위한 표현적인 DSL을 정의합니다. F# 5로 시작하여 토성과 같은 구성 요소의 저자는 다음과 같이 경고없이 사용자 정의 작업을 과부하 할 수 있습니다 목록 1.
목록 1 : 계산 표현식은 사용자 정의 작업을 과부하시킬 수 있습니다
입력원을 입력하십시오. = | 자리 표시 자의 텍스트 : 문자열 옵션 | 자리 표시 자의 비밀번호 : 문자열 옵션 유형 inputoptions = < Label: string option Kind: InputKind Validators: (string ->BOOL) ARRAY> 유형 입력 부를 입력 () = 멤버 T.수율 (_) = < Label = None Kind = Text None Validators = [||] >[] 멤버.텍스트 (io,?자리 표시 자) = < io with Kind = Text placeholder >[] 멤버.비밀번호 (io,?자리 표시 자) = < io with Kind = Password placeholder >[] 멤버.레이블 (io, label) = < io with Label = Some label >[] 멤버.유효성 검사기 (io, [] Validators) = < io with Validators = validators >입력하자 = inputBuilder () let name = input < label "Name" text with_validators (String.IsNullOrWhiteSpace >> NOT)> 이메일 = 입력하자 < label "Email" text "Your email" with_validators (String.IsNullOrWhiteSpace >> 그렇지 않음) (재미 S-> s."@"))> let password = 입력 < label "Password" password "Must contains at least 6 characters, one number and one uppercase" with_validators (String.exists Char.IsUpper) (String.exists Char.IsDigit) (fun s ->에스.길이> = 6)>
사용자 정의 작업에서 과부하에 대한 적절한 지원.
계산 표현식에 대한 적용 양식과 사용자 정의 작업을 과부하하는 기능을 갖춘 F# 라이브러리 저자가 다음에 무엇을 할 수 있는지 알게되어 기쁩니다.
다양한 일반적인 인스턴스화에서 인터페이스 구현
F# 5부터 시작하면 이제 다른 일반적인 인스턴스화에서 동일한 인터페이스를 구현할 수 있습니다. 이 기능은 F# 오픈 소스 기고자 인 Lukas Rieger와 협력하여 개발되었습니다.
입력 IA = Abstract Member Get : Unit-> ?t myclass () = 멤버 x와의 인터페이스 ia를 입력합니다.get () = 1 인터페이스 ia 멤버 x와 함께.get () = "hello"let mc = myclass () let asint = mc :> Il astring = mc :> ia asint.get () // 1 asstring.get () // "안녕하세요"
더 .순간 인터 로프 개선
.Net. 인터페이스 안에 .NET은 이제 메소드 및 속성에 대한 기본 구현을 지정할 수 있습니다. F# 5를 사용하면 이러한 인터페이스를 직접 소비 할 수 있습니다. 다음 c# 코드를 고려하십시오
시스템 사용; 네임 스페이스 Csharplibrary < public interface MyDim < public int Z =>0; >>
이 인터페이스는 f#에서 직접 소비 될 수 있습니다
csharp 열기 // 인터페이스를 구현하기 위해 객체 표현식을 만듭니다 < new MyDim >printfn $ "dim from c#:"
또 다른 개념 .더 많은 관심을받는 NET NULLABLE Value 유형입니다 (이전에 Nullable 유형이라고 함). 처음에 SQL 데이터 유형을 더 잘 표현하기 위해 생성되었으며, Microsoft의 데이터 프레임 추상화와 같은 핵심 데이터 조작 라이브러리의 기초입니다.데이터.분석 . 이러한 라이브러리와 상호 로프가 더 쉽게 보이도록하려면 메소드를 호출하고 널리 보급 가능한 값 유형의 속성에 값을 할당하는 새로운 유형 지향 규칙을 적용합니다. 패키지 참조 지침과 함께이 패키지를 사용하여 다음 샘플을 고려하십시오
#R "Nuget : Microsoft.데이터.분석 "오픈 시스템 오픈 마이크로 소프트.데이터.분석 Let DateTimes = "DateTimes"|> PrimitivedAtaFrameColumn // 다음은 컴파일에 실패하는 데 사용됩니다.구문 분석 ( "2019/01/01") DateTimes.Append (DATE) // 이전은 이제 다음과 같습니다.구문 분석 ( "2019/01/01") let data = nullable (date) datetimes.부록 (데이터)
이 예제는 예제에서 보여주는 것처럼 무효 유형 생성자를 사용하여 무효가 가능한 값 유형을 명시 적으로 구성하도록 요구하는 데 사용되었습니다.
더 나은 성능
Microsoft 팀은 지난해 Visual Studio와 같은 IDE의 처리량 및 툴링 성능 측면에서 F# 컴파일러 성능을 향상시키는 데 보냈습니다. 이러한 성능 개선은 하나의 큰 릴리스의 일환이 아닌 점차적으로 출시되었습니다. F# 5에서 절정에 이르는이 작업의 합은 일상적인 F# 프로그래밍의 차이를 만들 수 있습니다. 예를 들어, 동일한 코드베이스를 컴파일했습니다 ? F# 컴파일러를 강조하는 프로젝트 인 FsharPlus의 핵심 프로젝트 ? 세 번. F# 5의 경우, 최신 F# 4의 경우.7 .순 코어, 최신 F# 4의 경우 한 번.5 인치 .NET 코어, 표시된대로 1 번 테이블.
결과 1 번 테이블 DotNet Build /CLP : Command-Line에서 PerformancesUnnary를 실행하고 F# 컴파일러 인 FSC 작업에 소요되는 총 시간을 살펴보십시오. 프로세스 우선 순위 또는 배경 작업과 같은 것들에 따라 결과가 컴퓨터에 따라 다를 수 있지만 컴파일 타임에서 거의 동일하게 감소해야합니다.
IDE는 일반적으로 메모리 사용에 의해 영향을받습니다. Visual Studio와 같은 IDE는 언어 서비스 내에서 오랜 수명 프로세스로 컴파일러를 호스팅하기 때문입니다. 다른 서버 프로세스와 마찬가지로 메모리가 적을수록 GC 시간이 적을수록 오래된 메모리를 정리하고 유용한 정보를 처리하는 데 더 많은 시간을 소비 할 수 있습니다. 우리는 두 가지 주요 영역에 중점을 두었습니다
- 메모리 매핑 된 파일을 사용하여 메타 데이터를 사용하여 컴파일러에서 읽습니다
- 모든 참조 찾기 및 이름 바꾸기와 같은 솔루션에서 기호를 찾는 작업을 재구성
결과는 IDE 기능을 사용할 때 더 큰 솔루션에 대한 메모리 사용량이 크게 줄어 듭니다. 그림 5 실행할 때 메모리 사용의 예를 보여줍니다.
이 작업은 처음으로 실행될 때 완료하는 데 1 분 11 초가 걸립니다.
F# 5 및 Visual Studio 용 업데이트 된 F# 도구를 사용하면 동일한 작업이 완료하는 데 43 초가 걸리고 다음과 같이 500MB 이상의 메모리를 사용합니다 그림 6.
결과가 표시된 예 그림 5 그리고 그림 6 대부분의 개발자는 매우 큰 코드베이스에서 String과 같은 기본 유형의 사용법을 찾고 있지 않기 때문에 F# 5를 사용할 때 얼마나 나은 성능이 얼마나 나은지를 보여줍니다.
성능은 끊임없이 작업하는 것이며 개선은 종종 오픈 소스 기고자로부터 나옵니다. 그들 중 일부는 Steffen Forkmann, Eugene Auduchinok, Chet Hust, Saul Rennison, Abel Braaksma, Isaac Abraham 등을 포함합니다. 모든 릴리스에는 오픈 소스 기고자의 놀라운 작품이 있습니다. 우리는 그들의 일에 영원히 감사합니다.
계속되는 F# 여행 및 참여 방법
Microsoft F# 팀은 올해 F# 5를 출시하게되어 매우 기쁩니다. F# 5는 우리를위한 새로운 여정의 시작을 나타냅니다. 앞으로, 우리는 대화식 경험을 지속적으로 개선하여 F#을 노트북 및 기타 대화식 툴링에 가장 적합한 선택으로 만들 것입니다. 우리는 언어 설계에 더 깊이 들어가고 DiffSharp와 같은 라이브러리를 계속 지원하여 F#을 기계 학습을위한 설득력있는 선택으로 만들 것입니다. 그리고 언제나 그렇듯이 우리는 F# 컴파일러 및 툴링 기초를 향상시키고 모두가 즐길 수있는 언어 기능을 통합 할 것입니다.
우리는 당신도 타기 위해 오는 것을보고 싶습니다. F#은 언어 제안, 언어 설계 및 핵심 개발과 함께 전적으로 오픈 소스입니다. 오늘날 우수한 기여자들이 있으며 우리는 F# 언어 및 도구가 어떻게 발전하는지에 대한 지분을 갖고 싶어하는 더 많은 기고자를 찾고 있습니다.
기술적 수준에 참여하려면 다음 링크를 확인하십시오
- F# 언어 제안 : https : // github.com/fsharp/fslang-suggestions
- F# 언어 설계 : https : // github.com/fsharp/fslang-design
- F# 개발 : https : // github.com/dotnet/fsharp
- f# JavaScript에서 실행 : https : // fable.io/
- F# Visual Studio Code 용 툴링 : http : // Ionide.io/
- F# 웹 어셈블리 실행 : https : // fsbolero.io/
F# Software Foundation은 또한 다양한 하위 커뮤니티가 서로 정보를 공유 할 수있는 중심점 일뿐 만 아니라 큰 슬랙 커뮤니티를 주최합니다. 무료로 가입 할 수 있으므로 자세한 내용을 알아 보려면 여기 웹 사이트로 가십시오 : http : // Foundation.fsharp.org/join
F#가 다음에 어디로 가는지, 어떻게하는지에 대해 말하고 싶어? 같이하자. 우리는 함께 일하고 싶습니다.
Jupyter 노트북
Jupyter 노트북은 문서에서 Markdown과 코드를 혼합 할 수있는 대화식 프로그래밍 도구입니다. 코드는 노트북에서 실행될 수 있으며, 종종 설명과 함께 손을 잡는 구조화 된 데이터 또는 차트를 생성 할 수 있습니다.
Jupyter 노트북은 Python 프로그램을위한 대화식 프로그래밍 도구 인 Ipython으로 시작했습니다. 그것은 많은 다른 언어를 지원하기 위해 성장했으며 이제는 데이터 과학자들이 자신의 작업에서 사용하는 주요 도구 중 하나입니다. 또한 교육 도구로 사용되고 있습니다.
표 1 : fsharpplus의 컴파일 시간.최근 F# 버전에서 DLL
f# 및 .순 SDK 버전 | 컴파일 할 시간 (몇 초) |
F# 5 및 .순 5 SDK | 49.23 초 |
F# 4.7과 .순 코어 3.1 SDK | 68.2 초 |
F# 4.5와 .순 코어 2.1 SDK | 100.7 초 |
F# 프로그래밍 언어 : 역사, 혜택 및 미래 가능성
Nescient 개발자는 이름을 F로 발음하는 실수를 저지를 수 있습니다 ‘해시시’ 그러나 그것은 개발자의 능숙한 사람들로부터 몇 가지 경멸적인 눈을 얻을 것입니다’S 커뮤니티. f Sharp ( #이 선명하게 발음되기 때문에)는 오픈 소스, 강력하게 입력 된 다중 파라 디그 프로그래밍 언어입니다. 다중 파라디가 프로그래밍 언어는 기능적, 명령 및 객체 지향 프로그래밍을 포함합니다
모든 프로그래밍 언어는 두 범주 중 하나에 속할 수 있습니다. 강력하게 입력하고 약하게 타이핑했습니다.
강력하게 타이핑 된 언어는 컴파일 시점에 매우 고집스러운 규정을 가지고있어 오류와 예외가 발생할 가능성이 높다는 것을 암시합니다. 이러한 규정의 대부분은 반환 값, 가변 할당 및 기능 호출에 영향을 미칩니다.
약하게 타이핑 된 언어는 반대이며 예측할 수없는 결과를 습격하거나 런타임에 암시 적 유형 변환을 유발할 수있는 느슨한 타이핑 규칙이 있습니다.
Multi-Paradigm은 프로그래머가 주어진 프로젝트에 가장 적합한 프로그래밍 스타일 및 관련 언어 구성을 선택할 수 있도록 하나 이상의 프로그래밍 패러다임을 지원하는 것을 말합니다.
종종 크로스 플랫폼 CLI (공통 언어 인프라)로 사용되며 JavaScript 및 GPU (그래픽 처리 장치) 코드를 생성 할 수도 있습니다.
F# Software Foundation 및 Microsoft가 다른 공개 기고자와 함께 개발했습니다.
약력
F#은 2005 년 Microsoft Research에서 개발 한 후 처음으로 시작되었습니다. 처음에, 그것은이었다 .OCAML의 NET (DOT NET으로 발음) 기능 언어의 전력과 구문을 수천 개의 라이브러리 기능과 결합했기 때문에 OCAML 구현 .순 언어.
2005 년부터 F#은 필요한 많은 변화를 겪었으며 개발자는 다양한 버전을 만들어 첫 번째 버전보다 더 나은 버전을 만들었습니다. Apache 라이센스에 따라 출시되어 프로그래밍 언어를 공개 소스로 만들었습니다.
2005 년에 시작된 첫 번째 버전은 Windows 와만 호환되었으며 .순 1.0 ~ 3.5 런타임. 좁은 플랫폼베이스는이 버전의 가장 큰 약점이었습니다. 이 문제는 버전 2의 지원되는 플랫폼에 OS X와 Linux를 추가하여 개발 된 다음 버전에서 해결되었습니다.0은 2010 년에 시작되었습니다.
2012 년에 F#은 지원되는 플랫폼에 JavaScript 및 GPU가 추가되었습니다. 최신 버전은 2015 년에 출시되었습니다.0.
F#의 미래
많은 사람들은 F#이 가장 인기가없고 과소 평가되고 과소 평가 된 프로그래밍 언어 중 하나라고 주장합니다. 그러나 이야기에는 또 다른 측면이 있습니다. stackoverflow에 따르면. F#은 전 세계 최고급 급여와 관련된 언어로 선정되었습니다.
같은 설문 조사에 따르면 F#이 수행됩니다’t 전 세계에서 사용되는 상위 25 개 프로그래밍 언어로 나타납니다. 실제로 활발한 커뮤니티가 있음에도 불구하고 언어는 프린지에 남아 있습니다.
그러나 개발자는 왜 F#와 함께 일하는 것을 좋아합니까?’너무 인기가 없습니다? Don Syme이 생성하고 유지 관리하는 F#은 Scala와 같은 유사한 FP 언어가 채택한 가정 된 과잉 복제 중 일부와 비교적 탄력적이었습니다. 이 저항은 기능 프로그래밍에 관심이있는 외부 세계의 개발자에게 접근성을 유지합니다.
F#은 데이터 중심 및 도메인 구동 개발과 관련하여 탁월한 사용을 해왔습니다. 이제 세상인 JavaScript로 편집 될 수도 있습니다’가장 인기있는 언어. 이 링크를 보안하면 JavaScript에도 액세스 할 수 있습니다’광범위한 라이브러리 및 장치 기반.
F#은 인공 지능, 머신 러닝 및 관련 데이터 분석과 관련하여 그 표시를했습니다. 그것은 f#의 창조의 목적이었습니다. 엄청난 규모와 예상되는 영향으로 인해 인공 지능은 일반적으로 언어 생태계와 기술에 대한 것이며, 언어는 개발 장소에 매우 적합한 언어가 빠르게 성장하고 미래에 JavaScript 및 Python과 같은 인기있는 언어에 도전 할 수있는 강력한 위치에 적합합니다.
F#을 중지하는 것’S 성장?
소화하는 것은 가혹한 사실 인 것처럼 보이지만, 이것에 대한 책임은 주로 Microsoft 인 제작자에 기인합니다. 그들은 f#의 인기를 제한했습니다. Microsoft는 F#을 C#보다 열등하게 만들었습니다.
그것에주기적인 움직임이 있습니다. F# 개발자가 거의없고 F# 개발자가 적기 때문에 F#에 대한 작업이 거의 없습니다. 그러나 느리지 만 확실 하게이 추세는 변하고 있습니다.
제트기.Com은 F#의 사용을 채택한 최초의 주요 회사였습니다. 나중에 Kaggle과 많은 금융 및 보험 회사도.
F#의 개발자는 AI에서 크게 사용되는 다중 파라디그 언어로 기능을 더 인기 있고 기능을 갖추려는 시도가 부족합니다. 가장 좋은 방법은 더 짧은 런타임, 버그가 적은 F#의 핵심 이점에 초점을 맞추는 것입니다. 이러한 기능을 강조하여 홍보되면 F# 인기의 사다리가 이전보다 빠르게 등반하는 데 도움이 될 수 있습니다.
f#은 C#보다 실제로 이점을 유지합니까??
이미 C#에 익숙합니다? 그런 다음 C#을 사용하여 자신의 브레이크 아웃 게임을 프로그래밍하는 방법을 배우십시오.
- F#은 많은 일반적인 프로그래밍 작업을 더 간단하게 만듭니다. 이것은 복잡한 유형 정의 작성 및 사용, 목록 처리, 상태 기계, 평등 및 비교 등을 수반합니다.
- 세미콜론, 곱슬 괄호 등이 없음 F#에서는 강력한 타입 추론 시스템이 존재하기 때문에 물체의 유형을 지정할 필요가 거의 없습니다. 또한 해당 문제를 해결하려면 코드 줄도 줄어 듭니다
- F#은 기능적 언어이지만 다른 스타일을 지원합니다’T 완전히 순수하여 데이터베이스, 웹 사이트 등의 비 영양 영역과 훨씬 쉽게 상호 작용할 수 있습니다. 특히 F#은 기능성 하이브리드/OO 언어로 설계되었으므로 C#으로 모든 것을 수행 할 수 있습니다. 그러나 f#는 원활하게 통합 되더라도 .모든 타사에 액세스 할 수있는 순 생태계 .순 도구 및 라이브러리.
- F#은 Intellisense 지원, 디버거 및 단위 테스트, 소스 제어 및 기타 개발 작업을위한 많은 플러그인을 갖춘 훌륭한 편집기를 얻을 수있는 Visual Studio의 일부입니다.
F# 미래
비동기와 유사합니다 < >차단하지만 향후 소비에 대한 결과를 캡처합니다. 이 구조는 결과가 즉시 필요하지 않을 때 여러 결과 회복 작업을 병렬로 수행하는 데 매우 유용 할 수 있습니다. 예를 들어, 여러 개의 읽기/변환 작업을 수행하거나 아직 계산되지 않은 값으로 캐시를 사전 채집합니다. Microsoft의 작업 병렬 라이브러리 .네트 4.0 향후 구현이 포함되어 있으므로이 버전은 이전에만 필요합니다 .순 버전. 의견, 제안 및 개선은 항상 환영합니다.
1: 2 : 삼: 4 : 5 : 6 : 7 : 8 : 9 : 10 : 11 : 12 : 13 : 14 : 15 : 16 : 17 : 18 : 19 : 20 : 21 : 22 : 23 : 24 : 25 : 26 : 27 : 28 : 29: 30 : 31 : 32: 33: 34: 35 : 36 : 37: 38: 39: 40 : 41: 42: 43: 44: 45: 46: 47: 48: 49: 50 : 51: 52 : 53: 54: 55 : 56: 57: 58: 59: 60 : 61: 62 : 63: 64: 65 : 66 : 67: 68: 69: 70 : 71: 72: 73: 74:
열려 있는 체계 열려 있는 체계.componentModel 열려 있는 체계.스레딩 /// 백그라운드 작업자에서 계산을 실행하고 결과 반환을 동기화합니다. 그만큼 /// 계산이 즉시 시작되고 결과가 준비 될 때까지 '값'블록을 호출합니다. 유형 미래'티>(에프 : 단위 -> '티)) = /// 정상 종료 계산 결과. 허락하다 변하기 쉬운 결과 :'티 옵션 = 없음 /// 결과 예외가 발생하면 결과. 허락하다 변하기 쉬운 내선 : 예외 옵션 = 없음 허락하다 Syncroot = 새로운 물체() /// 결과가 준비 될 때까지 기다리는 데 사용되는 펄스 객체. 보장 ()는 우리가 사용하여 사용됩니다 /// 결과가 필요한 경우 객체를 만들 필요가 없습니다. 허락하다 변하기 쉬운 맥박 : ManualResetevent = 없는 허락하다 확인을 보장하십시오() = 잠그다 Syncroot (재미있는 () -> 성냥 맥박 ~와 함께 | 없는 -> 맥박 새로운 ManualResetevent(거짓); | _ -> () 맥박)) /// 경고 : syncroot의 잠금이 이미 유지되면 전화. 대기 통지서를 펄럭입니다. 안전한 경우 // '펄스'가 생성 된 후 호출되었지만 Waitone이 호출되기 전에. 허락하다 Notifywaiters() = 만약에 맥박 <> 없는 그 다음에 맥박.세트() |> 무시하다 허락하다 일하다 = 새로운 배경 노동자() /// runworkerasync ()에서 지정된 기능 및 저장 결과를 실행하십시오. 모든 예외는 있어야합니다 /// 갇힌. 하다 일하다.일해.추가하다( 재미있는 args -> 노력하다 결과 일부( 에프()) ~와 함께 이자형 -> 내선 일부 이자형 잠그다 Syncroot ( 재미있는 () -> Notifywaiters())) /// 즉시/ 자동으로 시작합니다. 하다 일하다.런 워크 레라스 동기() /// 계산 값을 반환하고 결과가 아직 준비되지 않은 경우 차단됩니다. 회원 티.값 = // 사용 가능한 경우 즉시 반환 할 수 있습니다. 성냥 결과 ~와 함께 | 일부 엑스 -> 엑스 | 없음 언제 내선.Issome -> 들어올리다 (옵션.얻다 내선) | 없음 -> 허락하다 피 = 확인을 보장하십시오() // 대기 개체를 얻는 동안 변경된 경우 다시 확인하십시오. 성냥 결과 ~와 함께 | 일부 엑스 -> 엑스 | 없음 -> // 펄스가 있으면 잠금이 없어 괜찮습니다.세트 () 메소드는 우리가 때 사이에 호출됩니다 // '결과'를 확인하고 Waitone에게 전화를 걸어 Waitone은 즉시 돌아옵니다. 피.Waitone(10000000000)) |> 무시하다 성냥 결과 ~와 함께 | 일부 엑스 -> 엑스 | 없음 -> 만약에 내선.Issome 그 다음에 들어올리다 (옵션.얻다 내선)) 또 다른 실패 "미래 계산이 실패했습니다." /// 계산이 완료되면 true를 반환합니다. 회원 티.iscomplete = 성냥 결과 ~와 함께 | 일부 엑스 -> 진실 | 없음 언제 옵션.Issome 내선 -> 진실 | 없음 -> 거짓
네임 스페이스 시스템
네임 스페이스 시스템.componentModel
네임 스페이스 시스템.스레딩
여러 항목
미래 =
신규 : F : (Unit -> 'T) -> 미래
회원 ISComplete : bool
회원 가치 : 't
전체 이름 : 스크립트.미래
백그라운드 작업자에서 계산을 실행하고 결과 반환을 동기화합니다. 그만큼
계산이 즉시 시작되고 결과가 준비 될 때까지 '값'블록을 호출합니다.
Val F : (단위 -> 't)
유형 단위 = 단위
성명 : Microsoft.fsharp.핵심.단위
Val Mutable 결과 : 't 옵션
정상 출구 계산 결과.
't 옵션 = 옵션을 입력하십시오'T>
성명 : Microsoft.fsharp.핵심.옵션
Union Case 옵션.없음 : 옵션
Val Mutable Ext : 예외 옵션
예외가 발생한 경우 결과.
여러 항목
유형 예외 =
새로운 : 단위 -> 예외 + 2 과부하
회원 데이터 : Idictionary
회원 getBaseexception : 단위 -> 예외
멤버 getObjectData : 정보 : SerializationInfo * 컨텍스트 : StreamingContext-> Unit
회원 gettype : unit-> 유형
멤버 helplink : get, set과 함께 문자열
멤버 innerexception : 예외
멤버 메시지 : 문자열
회원 출처 : get, set과 함께 문자열
멤버 스택 트레이스 : 문자열
.
전체 이름 : 시스템.예외
--------------------
예외 () : 단위
예외 (메시지 : 문자열) : 단위
예외 (메시지 : 문자열, innerexception : exn) : 단위
Val Syncroot : 객체
여러 항목
객체를 입력하십시오 =
새로운 : 단위 -> obj
멤버 평등 : obj : obj-> bool
멤버 gethashcode : init-> int
회원 gettype : unit-> 유형
회원 TOSTRING : Unit-> String
정적 멤버 동등 : obja : obj * objb : obj-> bool
정적 멤버 참조 equals : obja : obj * objb : obj-> bool
전체 이름 : 시스템.물체
Val Mutable Pulse : ManualResetevent
결과가 준비 될 때까지 기다리는 펄스 물체. 보장 ()는 우리가 사용하여 사용됩니다
결과가 필요한 경우 객체를 만들 필요가 없습니다.
여러 항목
ManualResetevent =를 입력하십시오
EventWaitHandle을 상속합니다
새로운 : InitialState : bool-> ManualResetevent
전체 이름 : 시스템.스레딩.ManualResetevent
--------------------
ManualResetevent (InitialState : bool) : 단위
val resittpulse : (단위 -> ManualResetevent)
Val Lock : LockObject : 'lock-> action : (unit ->'t) -> 't (참조 유형이 필요)
성명 : Microsoft.fsharp.핵심.운영자.잠그다
발
경고 : Syncroot의 잠금 장치가 이미 유지되면 전화하십시오. 대기 통지서를 펄럭입니다. 안전한 경우
'펄스'가 생성 된 후 호출하지만 Waitone이 호출되기 전에.
EventWaitHandle.set () : bool
val 무시 : 값 : 't-> 단위
성명 : Microsoft.fsharp.핵심.운영자.무시하다
Val Work : 배경 작업자
여러 항목
BackgroundWorker =를 입력하십시오
구성 요소를 상속합니다
신규 : 단위 -> 배경 작업자
멤버 cancelAsync : 단위 -> 단위
멤버 cancellationpending : bool
회원 ISBUSY : BOOL
회원 보고서 프로그램 : 백분율 프로그램 : int-> init + 1 과부하
멤버 런 워크 커라스 동기 : 단위 -> 단위 + 1 과부하
멤버 workerreportsprogress : get, set과 함께 bool
회원 직원 업 포트 스 캐시 셀레이션 : get, set과 함께 bool
이벤트 Dowork : Doworkeventhandler
이벤트 ProgressChanged : ProgressChangedeventhandler
.
전체 이름 : 시스템.componentModel.배경 노동자
이벤트 배경 작업자.Dowork : Ievent
회원 iobservable.추가 : 콜백 🙁 't-> init) -> 유닛
Val Args : Doworkeventargs
Union Case 옵션.일부 : 값 : 't-> 옵션
발 E : exn
배경 노동자.Runworkerasync () : 단위
배경 노동자.Runworkerasync (Argument : OBJ) : 단위
Val T : 미래
회원 미래.가치 : 't
전체 이름 : 스크립트.미래 `1.값
Runworkerasync ()에서 지정된 기능 및 저장 결과를 실행하십시오. 모든 예외는 있어야합니다
갇힌.
즉시 / 자동으로 시작하십시오.
결과가 아직 준비되지 않은 경우 차단하는 계산 값을 반환합니다.
속성 옵션.ISSOME : BOOL
Val Rain : Exn : Exception-> 'T
성명 : Microsoft.fsharp.핵심.운영자.들어올리다
val get : 옵션 : 't 옵션 ->'t
성명 : Microsoft.fsharp.핵심.옵션.얻다
Val P : ManualResetevent
Waithandle.Waitone () : bool
Waithandle.Waitone (시간 초과 : 타임 스팬) : bool
Waithandle.Waitone (millisecondstimeout : int) : bool
Waithandle.Waitone (Timeout : Timespan, exitContext : bool) : bool
Waithandle.Waitone (millisecondstimeout : int, exitcontext : bool) : bool
Val Failwith : 메시지 : String-> 'T
성명 : Microsoft.fsharp.핵심.운영자.실패
회원 미래.iscomplete : bool
전체 이름 : 스크립트.미래 `1.iscomplete
계산이 완료되면 true를 반환합니다.
Val Issome : 옵션 : 't 옵션 -> bool
성명 : Microsoft.fsharp.핵심.옵션.Issome
복사 링크 사본 소스 RAW보기 테스트 코드 새 버전
추가 정보
링크: | http : // fssnip.NET/5T |
게시 : | 11 년 전 |
작가: | Jason McCampbell |
태그 : | 비동기, 병렬, 미래, 스레드 |
기능적 구축 .순 응용 프로그램 : f# vs c# 중에서 선택하기위한 안내서
효율성은 애플리케이션 개발 세계의 모든 것입니다. 제품을 더 빨리 시장에 출시하고 더 빠른 상쾌함을 제공 할 수있는 개발자와 조직은 항상 경쟁 업체보다 우위에 있습니다.
따라서 모든 사람은 항상 개발 시간을 줄이고 디버깅 및 테스트에 소요되는 시간, 그리고 완료된 시간을 고객에게 릴리스하는 방법을 찾고 있습니다.
기능 프로그래밍은 수십 년 전에 공통적으로 사용되었지만 객체 지향 프로그래밍 언어로 빠르게 지상을 잃었습니다.
관련 스폰서 컨텐츠
관련 스폰서
코드, 배포 및 Java를 스케일로 늘립니다.
Microsoft Azure. 더 알아보기.
그러나 최근 몇 년 동안 개발 효율성을 향상시키고보다 안정적이고 강력한 응용 프로그램을 구축하는 방법으로 기능 프로그래밍에 대한 관심이 부활 해 왔습니다.
C# 및 F#은 기본적으로 다른 방식으로 기능적 프로그래밍에 접근하는 사용자 기반이 점점 커지는 언어입니다.
이 기사는 이러한 언어 중 어느 언어가 팀과 프로젝트를 위해 기능 프로그래밍을 제자리에 두고자하는 개발자에게 가장 적합한 일을 조사합니다.
기능 대 객체 지향 프로그래밍에 대한 토론
토론을 이해하려면 명령 적 프로그래밍 패러다임의 차이점으로 약간 더 높은 수준에서 시작해야합니다.
- 필수 프로그래밍: 개발자가 단계별로 결과를 달성하는 방법을 지정하는 프로세스 기반 프로그래밍 접근 방식. 필수 프로그래밍은 프로그램 상태 및 상태 변경에 중점을 둡니다. Java 및 C ++와 같은 객체 지향 프로그래밍 언어는 일반적으로 필수 패러다임을 따릅니다.
- 선언 프로그래밍: 개발자가 원하는 결과 유형을 지정하는 결과 지향 프로그래밍 접근법. 선언 프로그래밍은 무국적 및 실행 순서가 무의미합니다. LISP, Python, Haskell 및 F#과 같은 기능적 프로그래밍 언어.
그러나 여러 언어가 각각의 측면을 제공하므로 모든 기존 프로그래밍 언어를 이러한 범주로 깔끔하게 나누는 것은 지나치게 단순화입니다. 그들은 하이브리드 또는 다중 파라 디그 언어입니다.
예를 들어, Java와 C ++는 전통적으로 명령적인 분류에 속하지만 기능적 측면도 있습니다. C#도 마찬가지입니다. 마찬가지로 F#은 기능적 언어로 간주되지만 필수 기능도 있습니다.
개발자가 사용하는 상위 10 개 언어 목록을보십시오. 당신은 그들이 주로 하이브리드 언어를 포함하고 있으며, 일부는 명령에 중점을두고 다른 사람들은 더 지배적으로 기능적입니다.
이 설문 조사에서 10 년 동안 최고의 자리를 차지한 JavaScript는 여러 가지 파라디그 언어로, 명령 적 객체 지향 기능과 기능적 기능을 모두 제공합니다.
채택의 범위를 감안할 때 각 패러다임이 제시하는 다양한 이점과 각 탁월한 사용 사례를 고려하는 것이 도움이됩니다.
명령 프로그램 : 혜택 및 사용 사례
명령 패러다임의 주요 이점 중 하나는이를 사용하여 작성된 코드가 일반적으로 쉽게 이해되며 읽기 쉽다는 것입니다. 또한, 필수 프로그래밍이 필요로하는 세심한 워크 플로 설명을 감안할 때 초보자 개발자조차도 따르기가 쉽다는 것을 알게됩니다.
그러나 세부 사항 필수 프로그래밍 수준에는 다운 사이드가 필요합니다. 예를 들어,보다 복잡한 응용 프로그램에서 코드는 신속하게 부풀어 질 수 있습니다. 코드 크기가 증가함에 따라, 빠르게 떨어지는 것처럼 읽기 쉬운 읽기 및 이해력.
또한 코드가 확장됨에 따라 버그 및 오류의 가능성이 증가합니다. 따라서, 명령적인 언어로 작업하는 개발자는 종종 많은 시간을 디버깅하고 테스트하는 데 소비하여 제품 릴리스를 지연시킵니다.
그럼에도 불구하고 필수 프로그래밍은 엄청나게 인기가 있으며 광범위한 사용 사례가 있습니다. 필수 프로그래밍을위한 기존 응용 프로그램에는 다음이 포함됩니다
- 하이퍼 텍스트 및 하이퍼 미디어
- 객체 데이터베이스 관리 시스템 (ODBMS)
- 클라이언트 서버 시스템
- 실시간 시스템
- 인공 지능, 기계 학습 및 신경망
- 오토메이션
기능 프로그래밍 : 혜택 및 사용 사례
기능 프로그래밍의 이점은 방정식의 효율성 측면에서 더 많이. 기능 코드는 언뜻보기에 읽고 이해하기 쉽지만 버그가없는 경향이 있습니다 (I.이자형., 상태 변경에 대한 부작용 없음), 디버깅 및 테스트에 소요되는 개발자 시간 감소.
더 적은 버그는 더 안전한 응용 프로그램에 적합하여 사이버 범죄자의 공격 표면을 제한하여 랜섬웨어 공격, 맬웨어 또는 SQL 주입의 가능성을 줄입니다.
기능적 프로그래밍은 병렬 처리 및 게으른 평가에서도 더 좋습니다. 또한 기능 코드는 더 모듈화되고 재사용 가능하여 중복 코드의 필요성을 줄입니다. 더 작은 코드 세트는 유지하기가 더 쉽고 성능이 높을 수 있습니다. 그러나 기능 코드는 메모리 집약적이어서 코드 크기 감소로 인한 속도 이점을 제거하고 실제로 전체 성능 감소로 이어질 수 있습니다.
기능적 프로그래밍은 대규모 데이터 세트의 조작을 다루는 데 효과적이기 때문에 학계 및 데이터 과학자들에게 특히 인기가 있습니다.
병렬 처리 및 불변성에 중점을두면 기능적 프로그래밍은 특히 유용합니다
- 데이터 과학
- 스프레드 시트 응용 프로그램
- 금융 및 위험 애플리케이션
- 배치 처리
기능 프로그래밍 : C# VS F#
C# 및 F#은 최근 몇 년 동안 인기를 얻은 언어입니다. 비록 둘 다 다중 파라 디그이지만, 주요 초점은 객체 지향적, 필수 원칙에 의존하고 F# 기능 원리에 의존함에 따라 주요 초점이 다릅니다. 그러나 기능 프로그래밍과 관련하여 하나는 다른 하나보다 성능이 뛰어납니다?
C#은 무엇이며 누가 사용하고 있는지?
c#. 위의 사용 통계에서 볼 수 있듯이 2022 년 개발자 중 가장 인기있는 언어는 개발자의 거의 3 분의 1이이를 사용했습니다. 또한 만족도 점수가 높으며 C# 사용자의 3 분의 2가 사용하는 것을 좋아한다고 말합니다.
C#은 웹 및 클라우드 서비스 개발과 게임 개발에 많은 용도를 찾고 있습니다. Microsoft에서 TrustPilot, StackoverFlow까지의 회사는 C#으로 응용 프로그램 및 서비스를 작성하고 있습니다.
C#의 기능 프로그래밍
C#은 주로 객체 지향적이고 돌연변이/상태이지만 기능적 기능이 있습니다. 다음은 C#에서 기능적 패러다임을 구현하는 몇 가지 방법입니다.
불변성을 만듭니다
C#의 데이터 유형은 본질적으로 변이 가능하기 때문에 기능 프로그래밍 원칙을 사용하려면 불변성을 만들어야합니다. 그리고 이것은 단순히 F#의 불변 데이터 유형에 의존하는 것보다 더 복잡합니다. 구체적으로 C#에서 불변 유형을 만들려면 유형을 읽기 전용으로 만들고, 세터 속성을 제거하고, 생성자를 사용하여 매개 변수를 제공 한 다음 기존 인스턴스를 변형시키지 않고 상태 변경이 필요할 때마다 새 인스턴스를 만듭니다.
LINQ 및 Lambda 표현식을 사용하십시오
Microsoft는 LINQ (Language Integrated Query) 프레임 워크를 구축하여 기능적 프로그래밍 기능을 C#에 도입했습니다. LINQ는 맵핑 (선택), 정렬 (OrderBy) 및 필터링 (여기서)을 포함하여 목록 또는 시퀀스에서 작동하는 기능을 제공합니다. 이러한 각 표현에는 인수 기능이 있습니다. 표현식은 기존 시퀀스를 돌리는 대신 시퀀스의 새로운 인스턴스를 만듭니다. LINQ는 SQL 테이블, XML 데이터 또는 기타 소스에 관계없이 데이터 세트 쿼리에 특히 유용합니다.
LINQ는 또한 기본적으로 익명 기능인 Lambda 표현을 사용할 수 있습니다. 익명 기능은 기능 프로그래밍의 주요 측면입니다. Lambda Expressions는 코드의 다른 기능에 대한 인수 역할을 할 수 있으며, 기능적 프로그래밍의 또 다른 일반적인 기능, 고차 기능 생성.
방법 체인을 사용하십시오
F#의 일반적으로 사용되는 기능은 파이프 라인 연산자이며 한 기능의 결과를 다른 기능으로 전달합니다. 파이프 라인은 C에 내장되어 있지 않지만 개발자는 메소드 체인 또는 유창한 인터페이스를 사용하여 특정 상황에서 파이프 라인을 모방 할 수 있습니다. 이것은 c#의 StringBuilder 기능을 사용하여 영향을 줄 수 있습니다.
메소드 체인은 또한 기능 프로그래밍, 카레링의 또 다른 일반적인 기능을 복제 할 수 있습니다. 카레는 여러 인수가있는 기능이 다른 시간에 해당 인수를받을 수 있도록합니다. 기본적으로 기능 프로그래밍에서 함수가 필요한 입력을 모두받지 못하면 누락 된 입력으로 새로운 기능을 인수로 반환합니다.
C#에서는 다기능 인수를 여러 개의 단일 인수 기능의 중첩 시퀀스로 분해하기 위해 메소드 체인으로 카레를 구현합니다. 그러나 이것은 F#에서만큼 깔끔하거나 효율적이지 않습니다.
이들은 숙련 된 C# 개발자가 C#에서 기능 프로그래밍 원리를 적용 할 수있는 방법 중 일부일뿐입니다. 그리고 단순히 F#을 사용하는 것보다 더 많은 노력이 필요할 수 있지만 C#이 제공하는 다른 모든 기능을 원하는 개발자는 실행 가능한 대안입니다.
F#은 무엇이고 누가 사용하고 있는지?
2005 년 Windows 플랫폼 용 Microsoft가 처음 출시 한 F#은 주로 기능적인 프로그래밍 언어입니다. 2010 년 Linux 및 MacOS 플랫폼을 포함하도록 확장 한 다음 2013 년에 JavaScript. 또한 2013 년에 F# Software Foundation은 개발에서 Microsoft와 F# 및 F# 커뮤니티 모두를 지원하기 위해 시작했습니다.
처음부터 F# 커뮤니티는 천천히. 이제 JavaScript Transpilers (Fable)에서 PAKET (Packet)에서 웹 개발 라이브러리 (SUAVE)에 이르기까지 GitHub 그룹과 다양한 커뮤니티 프로젝트가 포함됩니다.
나이에도 불구하고 F#은 여전히 입양을위한 실질적인 여지가 있습니다. 일반적인 사용 통계는 조금 어렵지만 30000 명 이상의 개발자의 JetBrains의 2021 설문 조사에 따르면 최근 1%만이 F#을 사용했거나 가까운 시일 내에 그렇게 할 계획이라고 밝혔다. 이에 비해 21%는 최근 C#을 사용했으며 4%는 곧 사용할 계획이었습니다. 그리고 F#은 C#보다 만족도 등급이 약간 낮지 만 개발자의 60% 이상이 사용하는 것을 좋아한다고 말합니다.
현재 Walmart 및 Huddle과 같은 잘 알려진 이름이 포함되어 있지만 프로덕션에서 F#을 사용하는 것으로 알려진 100 개 미만의 회사가 있습니다.
일부 개발자는 C#에 기본적으로 존재하는 기능적 기능에 의존하기보다는 F#을 C# 보완으로 사용하고 있습니다. 둘 다 컴파일하기 때문에 .순 중간 언어 (IL), 동일한 프로젝트에서 둘 다 사용할 수 있습니다.
기능 프로그래밍의 가장자리가있는 언어?
이것은 대답하기에 매우 간단한 질문 인 것 같습니다 : F#은 먼저 기능적이며 C#은 먼저 필수적이므로 Edge는 F#로갑니다. 그리고 최고 수준 에서이 진술은 사실입니다. 그러나 삶과 마찬가지로 응용 프로그램 개발은 고급 진실의 일반화 된 적용에 충분히 간단하지 않습니다.
더 좋은 질문은 당신, 팀 및 현재 진행중인 프로젝트에 적합한 언어입니다. 그리고 이것은 대답하기에 훨씬 더 복잡한 질문입니다.
기능 프로그래밍에 적합한 언어를 선택합니다
기능 프로그래밍 요구에 대해 C#과 F#을 선택할 때 결정에 영향을 미치는 몇 가지 고려 사항이 있습니다
- 프로젝트의 요구는 무엇입니까?? 응용 프로그램의 특정 기능 세트는 의사 결정 과정에서 먼 길을 갈 수 있습니다. 예를 들어, 애플리케이션의 가장 중요한 기능이 약간의 데이터 조작만으로 사용자 인터페이스 요소를 중심으로 회전하는 경우 C#에 집중할 수 있습니다. 그러나 애플리케이션이 데이터 집약적이고 UI 요소가 덜 중요하다면 F#에 기대어있을 것입니다.
- 각 언어마다 편안한 수준은 무엇입니까?? 응용 프로그램이 기능 프로그래밍의 혜택을받는 경우’t는 c#에 대한 경험이 충분하지 않으며 불변의 유형을 만들고 선언에서 표현으로 번역하는 데 필요한 조작을 쉽게 처리 할 수 있습니다. 그러면 f#을 고려해야합니다.
- 팀이 다른 언어를 어떻게 처리 할 것인가? 개발 팀과 함께 일할 때는 팀의 각 구성원의 기술과 경험을 고려해야합니다. 당신은 매우 숙련 된 F# 개발자가있을 수 있지만 f#에 노출되지 않은 다른 사람들은 거의 없습니다. 이로 인해 팀원이 다른 개발자가 작성한 코드로 작업하는 데 어려움이 생길 수 있습니다.
- 다중 언어 접근법이 가장 좋습니다? C#과 F#이 동일한 프로젝트에서 함께 작동하도록 개발 팀이 충분히 숙련되어 있습니까?? 이 언어 중 하나만으로도’t 응용 프로그램의 모든 요구를 충분히 해결하십시오? 그러나이 접근 방식을 취하기 전에 신중하게 생각하십시오. 어떤 언어를 별도로 사용하는 것보다 더 효율적이고 효과적인 경우에만 그렇게해야합니다.
결론
개발 프로젝트가 기능 프로그래밍을 요구할 때, 순수한 기능 언어에서 C# 및 F#과 같은 다중 파라 디그 언어에 이르기까지 개발 팀이 사용할 수있는 많은 옵션이 있습니다. 좋은 경쟁 옵션 중에서 최선의 선택을하는 것은 항상 간단하지는 않지만, 그 결정을 내리는 데 투자 한 시간은 개선 된 개발 효율성과 더 나은 엔드 제품으로 보상을받을 것입니다.