2017-04-26 1 views
2

language.ext (C#) 라이브러리를 시작점으로 함수형 프로그래밍에 대해 더 자세히 배우려고합니다. 나는 하나의 모나드를 사용하려하지만 내가 놓친 것이있다. 간단한 예를 들어, 참조 : < 왼쪽language.ext로 시작하기 (functional C#)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Dates 
{ 
    public class AssignmentDate 
    { 

     public static Either<string, AssignmentDate> Create(DateTime date) 
     { 
      if (date < MinValue) 
       return Left<string, AssignmentDate>("date out of range"); 

      return Right<string, AssignmentDate>(date); 
     } 

     public static DateTime MinValue => new DateTime(1950, 1, 1); 
    } 
} 

유형>과 오른쪽 <이> 확인할 수 없습니다. 분명히 뭔가 빠졌지 만 뭐라구? <> 올바르게 사용하고 있습니까? 이것은 <>을 사용할 때 반환 할 올바른 방법입니까? 누구든지 language.ext의 더 많은 예제를 가리킬 수 있습니까? 제공된 모든 도움에 많은 감사드립니다.

+1

포함하고있는 네임 스페이스를 가져 와서'new Left <...>'와 새로운 오른쪽 <...>'을 사용해야합니다. – Lee

+0

답장을 보내 주셔서 감사합니다. 일반적으로 Visual Studio는 이것을 찾기에 충분하지만 LanguageExt.Core 패키지를 살펴보면 Left <> 나 Right <> (내가 <> . 그것은 내가 여기에 근본적인 무언가를 잘못 이해했다고 생각하게합니다. 그러므로 질문입니다. –

+1

내가 누락 된 것을 발견했습니다 - "정적 LanguageExt.Prelude 사용"; 이것으로 문제가 해결되었습니다.이상하게도 Visual Studio는 다르게 작동합니다 (그리고 Object Browser를 통해 아무 것도 찾을 수 없었습니다). 도움 주셔서 감사합니다. –

답변

3

내가 누락되었습니다. "static LanguageExt.Prelude;를 사용했습니다." 이유는 모르겠지만 Visual Studio에서 조금 다르게 처리했으며 Object Browser에서 Left 또는 Right에 대한 참조를 찾을 수 없었습니다.

3

저는 Language-Ext의 저자입니다. LeftRight은 자체 형식의 생성자 함수가 아니라 생성자 함수이며 모두 Either<L, R>입니다. 많은 유형의 정적 클래스 Prelude에 생성자 함수가 있으므로 그 중 using static을 수행해야합니다. 네임 스페이스가 아니라 클래스입니다.

다음과 같이 쓸 수 있습니다. Prelude.Left<L, R>(...)Prelude.Right<L, R>(...). Right(x) : 당신이 그렇게 같은 Either을 구성 할 수 있도록 할

type Either<'l, 'r> = 
    | Left of l 
    | Right of r 

:

대수 데이터 유형 Either가과 같이 정의 할 수 있습니다 F 번호와 같은 기능 언어 (ADT를)를 시뮬레이션하는 것입니다.

다른 생성자 기능은 다음 Some(x)Option위한 None, Lst위한 List(x,y,z), Set위한 Set(x,y,x)을 등

Prelude 클래스 대신 할 필요없이 한 번 using static과 기본 기능의 톤을 포함하도록 쉽게 그런데 등

, using static LanguageExt.Option, using static LanguageExt.Either 할, 당신의 예를 작성하는 기능적인 방법은 다음과 같습니다

public static Either<string, AssignmentDate> Create(DateTime date) => 
    date < MinValue 
     ? Left<string, AssignmentDate>("date out of range") 
     : Right<string, AssignmentDate>(date); 

이유는 결과를 얻기 위해 여러 개의 명령문을 사용하는 반면, 3 항 연산자는 표현식이라는 것입니다. 함수형 프로그래밍을 배우고 있다면 언제나 표현식을 사용해보십시오. 예외는 로컬 변수를 선언해야하지만 대부분 C#에서 순수 표현식을 사용할 수 있습니다. 표현식이 너무 커지면 작은 함수로 나누십시오. 함수형 프로그래밍의 한 가지 부작용은 함수가 점점 작아지는 것입니다. 때로는 단 한 번의 업무 만 수행합니다.

+3

시간을내어 답변을 작성해 주셔서 감사합니다. 정말 감사. 나는 잠시 동안 함수형 프로그래밍을 배우려고 애를 썼는데, 제 질문은 부분적으로는 "Functional Programming in C#"에서 읽고있는 내용을 취해서 라이브러리의 기대치로 변환하려고 한 결과입니다. 만들었 어. 그것은 또한 내가 보통 11시 30 분에 이것을하려고 노력하는 것을 돕지 않습니다 ... 궁극적으로 이것은 제가 직장에서 적용 할 수 있기를 바라는 것이지만 아직 갈 길은 멀어 보이는 것처럼 보입니다. –

+0

확실히 기능적 사고 방식에 들어가려면 약간의 시간이 필요합니다. 물건을 넣을 일련의 아하 순간을 보게 될 것입니다. 나는 개혁 된 OO 프로그래머이기도하고 나를위한 과정이 계몽되어왔다. – louthster

+0

다음은 의제에서 스마트 생성자와 유효성을 파악하는 것입니다. 이 개념을 개념 증명으로 구축하고 기능을 도메인 중심 디자인 개념과 결합하기를 희망합니다. –