seq
모듈을 사용하는 것 외에 지원하는 컬렉션 유형과 관련하여 일반적인 기능을 작성할 수 있습니까?컬렉션 유형에 대한 추상화
목표는 새로운 컬렉션 기능을 추가 할 때 복사하여 붙여 넣기를 할 필요가 없다는 것입니다.
seq
모듈을 사용하는 것 외에 지원하는 컬렉션 유형과 관련하여 일반적인 기능을 작성할 수 있습니까?컬렉션 유형에 대한 추상화
목표는 새로운 컬렉션 기능을 추가 할 때 복사하여 붙여 넣기를 할 필요가 없다는 것입니다.
seq<'T>
형식은 F #의 모든 컬렉션에서 작동하는 계산을 작성하는 주요 방법입니다.
Seq
모듈 (예 : Seq.filter
, Seq.windowed
등)에서 기능을 사용할 수 있습니다 (예 : seq { for x in col -> x * 2 }
)IEnumerator<'T>
유형을 사용할 수 있습니다. 당신이 컬렉션의 자신을 압축을 구현하려는 경우이 비교적 간단 유형과는 컬렉션에서 데이터를 읽는 데 사용 할 수 있습니다 (이 GetEnumerator
를 호출하여 반환). 결과적으로 항상 seq<'T>
유형의 값을 얻을 수 있습니다.이 값은 기본적으로 지연 시퀀스입니다.
F 번호 콜렉션을 변환하기위한 임의의 메커니즘 (예를 들어, 일반적인 기능은 새로운 값으로 수집 C
에 수집 C
복용) 또는 (하스켈 또는 스칼라 가능) 컬렉션을 생성하기위한 임의의 메커니즘이 없다.
대부분의 실제 사례에서 나는 그 문제를 발견하지 못했습니다 - 대부분의 작업은 seq<'T>
을 사용하여 수행 할 수 있으며 특수한 컬렉션 (예 : 성능을위한 배열)이 필요할 때는 일반적으로 약간 다른 구현이 필요합니다 어쨌든.
콜렉션을 사용한 일반 프로그래밍은 일반적인 프로그래밍이 일반적으로 수행되는 것과 같은 방법으로 처리 할 수 있습니다.
let f (map_fun : ('T1 -> 'T2) -> 'T1s -> 'T2s) (iter_fun : ('T2 -> unit) -> 'T2s -> unit) (ts : 'T1s) (g : 'T1 -> 'T2) (h : 'T2 -> unit)=
ts
|> map_fun g
|> iter_fun h
type A =
static member F(ts, g, h) = f (Array.map) (Array.iter) ts g h
static member F(ts, g, h) = f (List.map) (List.iter) ts g h
조금 흉칙하지만 장황 할 수 있습니다. 클래스 및 정적 멤버를 사용하여 오버로드를 활용하고 있습니다. 코드에서 A.F 만 사용할 수 있으며 올바른 전문화가 호출됩니다.
더 좋은 솔루션은 https://stackoverflow.com/questions/979084/what-features-would-you-add-remove-or-change-in-f/987569#987569을 참조하십시오.이 기능은 코어 라이브러리에만 사용할 수 있지만 컴파일러를 수정하여 코드에서 사용할 수 있도록해서는 안됩니다. 이것은 컴파일러의 소스 코드가 열려 있기 때문에 가능합니다.
감사합니다, Joh. 이것은 실제로 매우 장황합니다. –
답변 해 주셔서 감사합니다. 그래서 내 원래 컬렉션의 유형에 대한 정보를 보관하고 싶으면 (나중에 "Seq.toArray"를 호출하여 강제로 "크 누스 셔플"을 손에 넣고 압연하여 Zip으로 작업하려는 경우) 반드시 물어야합니다 총알과 지퍼 복사 및 붙여 넣기 모든 컬렉션 유형을 지원하고 싶습니까? –
@Alexander : 네, 알고있는 한 컨테이너 독립적 인 알고리즘 (예 : C++)은 F #에서는 불가능합니다. 이론적으로 다른 컬렉션 유형을 중심으로 객체 지향 래퍼를 구현할 수 있다고 생각합니다.하지만 그만한 가치가 있습니까? - Wrt. 'zipWith' : 모든 콜렉션 모듈은'map2' 함수를 지원합니다. – wmeyer
@wmeyer : 감사합니다. 컨테이너 구현과 독립적으로 알고리즘을 작성할 수 있다는 것이 나를 위해 중요한 기능입니다. 대부분의 실제적인 경우에이 기능이 부족하지는 않다고 말했기 때문에 F # 코드를 구조화하는 기본적인 방법을 이해하지 못한다고 가정합니다. –