2013-05-25 4 views
9

Google 다트 언어는 기능 프로그래밍이 가능합니까? 특히 다음 기능이 지원됩니까? 변수 (참조)로서 저장다트는 함수형 프로그래밍을 지원합니까?

  • 기능
  • 기능 태닝,
  • 지연 파라미터
  • 함수형 프로그래밍의

다른 특징?

다트가 불변의 데이터를 지원하지 않는 것 같습니다.

답변

15

다트는 일류 함수를 가지고 있으며 많은 함수 프로그래밍 구조를 지원합니다.

예상대로
main() { 
    f1(x) => x * 2;   // Define the function f1 
    var f2 = f1;   // Assign f1 to the variable f2 
    print(f2(7));   // Feel free to call f2 like any other function 

    add(a) => (b) => a + b; // Curried addition 
    print(add(3)(4));  // Calling curried addition 

    var add3 = add(3);  // Combining the 
    print(add3(2));   // concepts 
} 

,이 생산 :

 
14 
7 
5 

나는 게으른 매개 변수이 가능 믿지 않는, 당신은 이미 주목 여기에 카레 기능 변수와의 기능을 할당의 몇 가지 예입니다 분명히 변경할 수있는 데이터가 있습니다.

5

"함수 프로그래밍"의 의미에 따라 다릅니다. 함수는 포인트 1을 다루는 퍼스트 클래스 객체입니다. 캐어링을 구현할 수있는 Function.apply이 있습니다. 포인트 2를 다루지 만 다트는 그다지 기능적이지 않습니다 (변경 불가능 - 아니요, 참조 투명도 - 아니요 , 게으른 평가 - 아니, 그밖에 또 무엇을 - 아마 또한 아니오).

+0

참조 투명도는 좋은 디자인의 기능입니다. 항상 언어가 아닙니다 (예, 때때로 강제 적용됩니다). 요점은, 당신은 불변의 객체 등을 사용하는 것 같은 좋은 프로그래밍 습관으로 99.9 %를 얻을 수 있다는 것입니다. – EdwardGarson

+0

Fortran을 거의 모든 언어로 작성할 수 있다는 것에 동의하지만 그게 중요하지 않습니까? :-) – Ladicek

+0

나는 잘 모르겠다. Fortran은 어떤 언어로도 쓸 수 없으며 Fortran에서만 쓸 수 있습니다. 컴파일러 (또는 : 언어) 지원 없이도 참조 투명성을 보장 할 수 있다는 요점을 놓치고 있습니다. 그것은 언어를 초월합니다. – EdwardGarson

4

작은 예에 대한 개방 문제 :

class Point { 
    Point(this.x, this.y); 
    int x,y; 
    int get sum => x + y; 
} 
class ImmutablePoint{ 
    final int x,y, sum; 
    const ImmutablePoint(x,y) : 
    this.x = x,this.y = y,this.sum = x + y; 
} 

class SemiImmutablePoint { 
    int _x, _y; // _ -like private but not access protected by the VM. 
    SemiImmutablePoint(this._x, this._y); 
    int get x => _x; 
    int get y => _y; 
} 

void main() { 
    List<int> li = [1,2,3,4,5]; 
    final List<int> immutableLi = const [1,2,3,4,5]; 
    li[1] = 10; //ok 
    li = [6,7,8]; //ok 
    immutableLi[1] = 10; //error because const 
    immutableLi = [6,7,8]; //error because final 
    var p = new Point(5,10); 
    p.x = 10; //ok 
    p.sum = 10; // error can't be directly mutated 
    var p2 = const ImmutablePoint(5,10); // compile-time constant 
    p2.x = 10; //error 
} 

당신은 함께 FP를 사용할 수 있습니다 다트 또는 심지어 유형이나 JS와 같은 불변의 언어가없는 언어. 그것은 단지 스타일 일 뿐이며, 언어에서 기본 구현을 요구하지 않습니다.

Scala FP 패러다임과 같은 언어는 일반적으로 유형 시스템으로 구현되므로 실수로 위반하는 것이 더 엄격하고 어렵습니다. 그러나 동시에 lib 사용자가 정말로 복잡한 유형 시스템, 때로는 범주 이론에 대한 전문 지식이 필요합니다. 그렇지 않으면이 항목이 "모나드"또는 "모노oid"또는 기타 무엇인지 알면 큰 이익을 얻을 수 없습니다. 나는 그것들이 모나드이거나 다트에서 "미래"라는 정말로 유용한 개념을 모른 채리스트를 사용할 수 있습니다. FP를 "타입 매직 (magic type)"없이 구현하면 평균 개발자가 더 명확하고 이해하기 쉽습니다. 그러나 동시에 강력한 유형 시스템을 사용하면 컴파일러가 고급 코드 최적화를 수행하고 더 나은 정적 코드 분석을 수행하는 데 도움이 될 수 있습니다.

Category theory for JavaScript programmers - 주목할 가치가있다.

추가 : 지금 컬렉션은 당신의 마지막 지점에 UnmodifiableListViewUnmodifiableMapBaseUnmodifiableMapView

+0

"FP 스타일은 최신 브라우저 엔진에서 많은 의미를 갖지 못합니다."... 어떤 부분이 정확히 젤을 만들지 못합니까? – EdwardGarson

+0

@EdwardGarson 지난 4 년 동안 나는 틀렸다는 것을 보여주었습니다 : P – JAre

+0

정확히 무엇이 잘못 되었습니까? – EdwardGarson

3

이, 불변성은 다음을 참조하십시오

리터을 제공하는 불변의 콜렉션과 「치 형」에 관한 library 및 codegen의 서포트 이 도움말 다리 불변 값을 인라인 "업데이트"를 수 있도록 예를 들어 OO와 함수형 프로그래밍 사이의 간격, "노드"와 "updatedNode"모두 불변

var node = new Node((b) => b 
    ..left.left.left.right.left.right.label = 'I’m a leaf!' 
    ..left.left.right.right.label = 'I’m also a leaf!'); 
var updatedNode = node.rebuild((b) => b 
    ..left.left.right.right.label = 'I’m not a leaf any more!' 
    ..left.left.right.right.right.label = 'I’m the leaf now!'); 

. 이 기사의 더 자세한 내용은 built_value for Immutable Object Models입니다.

관련 문제