2013-08-22 3 views
23

녹이 점점 더 돋보이게됨에 따라 그것에 대한 나의 관심은 부글 거리기 시작합니다. 대수 데이터 형식을 지원한다는 점과 그 중 특히 일치하는 부분이 이지만 다른 기능적 숙어에 대한 생각이 있습니까?/Will은 기능 프로그래밍 관용구를 지원합니까?

  1. 예 : 표준 라이브러리에 표준 필터/map/reduce 함수 모음이 있으며, 더 중요한 점은이를 구문에 맞는 방식으로 연결/구성 할 수 있습니까?

  2. 이미 ADT가 사용되는 우아한 방법이 있기 때문에 모나드는 어떻습니까? 특히 구문 해석 설탕은 어떨까요?

[1] 하스켈은 (.) 및 (>>>), C# 확장 방법 및 선택적으로 LINQ를 가졌으며 D에는 통합 함수 호출 구문이 있습니다.

+1

HKT를 유도 할 수있는이 매크로를 확인하십시오. https://gist.github.com/14427/af90a21b917d2892eace – CMCDragonkai

+0

인상적입니다! 유형 변수의 이름 지정이 다소 임의적 인 것처럼 보일지라도. 저는 여러분이 타입 변수로 형질을 가질 수 있다는 것을 알지 못했습니다. 이것은 탁월한 해킹입니다. –

답변

19

녹 HKT의 없지만, 그 반복자는 같은 고차 함수 (HOF)과 기능적인 스타일로 지원 코딩을 편리 체인과 map, filter, fold 등.

세부 사항은 일반적으로 가비지 수집되는 반면, 녹 프로그램은 프로그램 흐름의 일부로 C++ RAII와 마찬가지로 결정적 방식으로 메모리 관리를 처리합니다.

효율적으로 연결을 허용하려면 개별 HOF의 반환 가능한 구성 가능한 게으른 표식 템플릿 및 .to_owned_vec() 또는 .collect() 또는 무엇이든으로 마무리하여 최종 결과를 데이터 (할당 및 한 단계로 평가)로 바꿀 수 있습니다.

어떤 상황에서는 이것이 필요하지 않은 경우 반환되는 expression-template은 반복자이며 충분하면 충분할 수 있습니다. 예를 들어, for 루프를 사용하여이를 반복하거나 일반 함수에 인수로 전달할 수 있습니다.

은 참조 :

비슷한 패턴이 모두 C (추가 라이브러리와) ++ (11)와 녹 가능하다. Rust의 generics는 C++ 템플릿만큼 강력하지 않지만 기본적으로 불변성, 표현 지향 구문, 다형성 람다 및 양방향 유형 추론을 통해 함수형 언어에 약간 더 가까운 느낌을줍니다.

'확장 방법'과 통일 된 호출 구문에 관해서도 Rust는 코드를 체계화하는 것과 비슷한 '개방형'방식을 허용합니다. impl을 더 많은 방법으로 라이브러리 또는 프로그램의 모든 유형에 추가하거나 자신의 특성의 메소드를 구현하여 다른 라이브러리의 기존 유형을 확장 할 수 있습니다.

이렇게하면 C++보다 chainable 메서드 호출 스타일을 사용하기가 쉬워집니다. 즉, 형식을 수정하거나 파생 할 필요가 적습니다.

하스켈의 숙어가 순도와 관련이 있다는 것을 명심하십시오 (예 : IO 모나드, 렌즈 ..). 녹은 순수한 기능이 아닌 다중 패러다임입니다. 프로그램 수준에서 참조 투명성의 이점을위한 순수한 함수를 가질 수 있지만 변경 가능한 지역 변수로 구현이 단순화됩니다.

+1

이것은 유익하고 다른 대답을 보완합니다. 하지만 형질을 사용하지 않으면 D에 비해 런타임 다형성과 잠재적 인 비선형 성을 도입한다는 것을 의미합니까? 나는 당신이 표현 템플릿 (깔끔한!)으로 그것을 피할 수 있다고 생각하지만, 같은 코드에 대해 특성을 사용할 수 있다면, 그것은 더 멋질 것입니다 ... 어쨌든, 그것은 여전히 ​​C#의 IEnumerable보다 우수 할 것입니다. –

+2

형질은 런타임 및 컴파일 타임 다형성 모두에 사용됩니다. 그들은 제안 된 C++ 개념 (더 나은 컴파일 타임 오류를위한 템플릿 매개 변수 경계)과 같거나 특성을 인스턴스화하여 특성을 사용하여 vtable을 형식화 할 수 있습니다. C++과 마찬가지로 명시 적으로 요청하면 vtable 만받습니다. –

+0

C++과 달리 (그리고 Go와 마찬가지로) vtables ptrs는 포인터와 함께 전달됩니다. 기본 구조체에는 클래스 정보가 포함되어 있지 않습니다. –

15

Functors, Applicatives 및 Monads와 같은 개념을 지원하려면 언어에 "더 높은 종류의 유형"이 있어야합니다. 즉, 언어는 * -> * 형식의 함수 또는 형식의 함수를 추상화 할 수 있어야합니다. Rust는 현재이 수준의 추상화를 지원하지 않습니다. 가능한 미래 방향으로는 discussed 이었지만, 나는 곧 초점이 될 것이라고 기대하지는 않습니다.

+1

질문 1에 대해 무엇입니까? 지금 내게 더 중요해 보입니다 ... –

+0

예, http://stackoverflow.com/questions/17054978/composition-operator-and-pipe-forward-operator-in-rust –

+2

C#은 LINQ를 통해 Monads를 지원합니다. IEnumerable 및 IObservable 은 모두 모나드/린키입니다. 그러나 C#은 상위 종류의 타입을 지원하지 않으므로이 대답의 어설 션이 정확한지 확신 할 수 없습니다. 아마 당신은 약간 더 구체적인 것을 의미 할 것입니다. – bradgonesurfing