2009-06-03 3 views
3

포인트가없는 기능적 스타일로 프로그램을 만들려고 할 때 "점 표기법"이 객체 및 레코드와 함께 작동하는 방식이 불안정합니다. (위대하고 간결하다고 생각합니다. 기본적으로 카레 기능 언어를 사용하는 방법).객체/레코드가있는 점이없는 스타일 F #

내가 누락 된 연산자 또는 기능이 있습니까 : (.) object method 대신 object.method?

(I 새로운 ? 연산자에 대해 무엇을 읽고부터, 나는 그것이 정의를 필요로하고 내가 필요가 있다고 생각하지 않는, 전체 동적 바인딩 일에 들어갔을 제외하고는. 같이 작동합니다 생각합니다.)

즉, 인수에 일반 함수를 적용하는 것처럼 해당 객체에 메소드를 적용 할 수 있습니까?

+1

소리가 나고 외견 상으로 (더 괄호로 바꿔야 할 필요가 있기 때문에) 나는 두려운 것이 없습니다. – em70

답변

5

짧은 대답 : 아니오.

긴 대답 : 당신의 과정에서 의미가 코드

let l = [1;2;3] 
let h1 = l.Head 
let h2 = List.hd l 

예를 들어 ... 특정 유형의 메소드를 호출 모듈에서하자 바인딩 기능을 만들 수 있습니다 "목록 .hd "는"목록의 머리글 "에 대해 원하는 버전입니다. 또는 로컬로, 언제든지 할 수 있습니다.

let AnotherWay = (fun (l:list<_>) -> l.Head) 
let h3 = AnotherWay l 

그러나 주어진 유형에 임의의 인스턴스 메소드를 '이름 지정'하는 좋은 방법이 없기 때문에 일반적인 것은 없습니다. 'AnotherWay'는 " '< _>'개체 '의'Head '속성에서 기능을 만드는 방법을 보여 주지만 일류 함수 값으로 처리하려는 모든 인스턴스 메서드에 대해 이러한 상용구가 필요합니다.

SomeType..Foo optArgs // note *two* dots 

fun (x : SomeType) -> x.Foo optArgs 

을 무엇을 의미하는지

경우, 언어 설계에 관해서 제안으로

:

난이 일반화 언어 구조를 만드는 제안?

경우에 당신은 'functionize'이 경우 속성에 대한 방법으로

list<_>..Head 

을 쓸 수 있지만, 우리가 이제까지 F 번호의 해당 분야에서 아무것도 할 경우,이 후 VS2010 될 것이다.

+2

문자열의 시퀀스를 각각의 길이로 '맵핑'해야하고 인스턴스 속성에 액세스 할 수 있도록 람다를 만들어야하는 경우가있었습니다. 나는 이것을 정적으로 접근하는 방법을보고 싶다. 기존의 일부 기능이 중복 될 수 있습니다. (List.hd와 마찬가지로) – YotaXP

2

질문을 올바르게 이해하면 답변을 드릴 수 없습니다. 점 (.)은 F #에서 연산자가 아니며 언어에 내장되어 있으므로 함수로 사용할 수 없습니다.