면책 조항 :이 답변은 F #에는 적용되지 않습니다. Mark의 대답은 F #이 제공하는 최고의 답변입니다. 특히 차별화 된 노동 조합 접근법에는 C#이 직접적으로 동등한 것이 없습니다.
하지만 "기능적"에 대해 물어 보면 다른 일부 기능 언어가 더 나은 옵션을 가지고 있습니다. 스칼라 (Scala)와 하스켈 (Haskell)과 같은 다른 기능 언어는 typeclasses라는 기능을 제공합니다.이 기능은 본질적으로 인터페이스를 구현하는 확장 메서드를 만들 수 있고 그 후에 인터페이스에 볼트를 적용 할 수 있습니다.
그럼 어떻게 관련이 있습니까? F #의 경우, A) Discriminated Union에서 모든 사례를 사전 결정하거나 B) 데이터 라이브러리에 렌더링 기능을 넣어야합니다. 어느 쪽도 이상적이지 않습니다. typeclasses와
, 당신은 독립적으로 레코드 유형을 정의 할 수 있습니다 :
// Blog.fs
type Blog {...}
[<SomeProviderAttribute>]let getBlogs() = ... // returns Blog seq
// Movie.fs
type Movie = {...}
[<SomeProviderAttribute>]let getMovies() = ... // returns Movie seq
가 그럼 당신은 높은 수준에서 인터페이스에 볼트 수 : 메인 UI 지역에서 마지막으로
// UiBase.fs
class Renderable where render :: 'T -> string
// BlogUi.fs
instance Renderable Blog where render blog = blog.header + blog.text
// MovieUi.fs
instance Renderable Movie where render movie = movie.title + movie.description
(의사 코드는 다음과) 렌더링 된 문자열을 쉽게 수집 할 수 있습니다. 당신이 있었기 때문에, 상호 교환 높은 수준에서 클래스와 공급 업체를 블로그와 동영상
// MainUi.fs
open Blog; open Movie; open UiBase; open BlogUi; open MovieUi
// Just like you'd have to call "using" in C# to get the extention methods,
// you have to open these to get the type classes
let dataProviders = ... // Some assembly search and reflection here;
// say it returns [getBlogs; getMovies]
// (and note without the common typeclass,
// those two would be incompatible)
let renderedStrings =
seq { for provider in dataProviders do
for renderable in provider() do
yield render renderable }
그래서 기본적으로 당신이 (그렇지 않으면 전혀 관계가없는)을 사용할 수 있습니다 : 당신이 typeclasses을 정의하는 모듈을 열면 상호 교환 사용할 수 있습니다 중간 레벨에서 인터페이스를 "볼트로 고정"할 수 있습니다. 당신이 여기에서 직면하고있는 일반적인 문제에 대해 매우 시원하고 적절합니다.
...불행히도 F # 자체에는이 기능이 없습니다.
@ user2864740 인터페이스는 구현이 전혀없는 영광스러운 추상 클래스에 불과합니다. 내 질문은 내 API를 구현하는 방법이 아니며 운영 계약입니다. 그것은 내 데이터 구조를 구현하는 방법에 관한 것이 었습니다. –
@ user2864740 - 모든 OO 설계 원칙을 잘 알고 있습니다. 적절한 함수 프로그래밍 디자인 원리에 대해 묻고 있습니다. 이것이 나의 질문의 목적이다. 나는 클래스와 인터페이스의 차이점에 대해 신경 쓰지 않고있다. 내 요점은 상속을 사용하여 클래스 또는 인터페이스,이 상황에 대해 알고있는 유일한 옵션입니다. 표준 .NET 클래스 또는 인터페이스를 사용하는 f #에서는 상속 요구 사항으로 인해 구분 된 공용체 또는 레코드 유형을 공급자별로 사용할 수 없습니다. 만약 내가 틀렸다고 생각하지 않는다면 어떤 경우에 타입 유추도 제거합니다. –
"help"에 대해 * serious *하다면 관련/제안 구조를 포함하십시오. 다시 말하지만,이 질문은 어떤 식 으로든 "순전히 기능적"과 관련이 없습니다. – user2864740