2012-02-08 2 views
2

나는 조금 더 비슷한 질문을 다시 한 번 유감스럽게 생각합니다. 하지만 불행히도 차별화 된 노동 조합을 어떻게 디자인해야하는지 정말로 이해할 수는 없습니다.F # 식별 차별화 된 노조

그래서 내가

 

type Artist(artistId : int, name : String) = do if name = null then nullArg String.Empty new(artistId: int) = Artist(artistId) member x.ArtistId = artistId member x.Name = name

and Genre() = let mutable name = String.Empty let mutable genreId : int = 0 let mutable description = String.Empty let mutable albums = List.empty member x.Description with get() = description and set(value) = description <- value
member x.Albums with get() = albums and set (value) = albums <- value

and Album() = let mutable title = String.Empty let mutable albumId = 0 let mutable genreId = 0 let mutable artistId = 0 let mutable price : decimal = Decimal.Zero let mutable albumArtUrl = String.Empty let mutable genre = new Genre() let mutable artist = new Artist(artistId) member x.Title with get() = title and set (value) = title <- value member x.Genre with get() = genre and set (value) = genre <- value member x.AlbumId with get() = albumId and set (value) = albumId <- value member x.GenreId with get() = genreId and set (value) = genreId <- value member x.ArtistId with get() = artistId and set (value) = artistId <- value member x.Price with get() = price and set (value) = price <- value member x.AlbumArtUrl with get() = albumArtUrl and set (value) = albumArtUrl <- value member x.Artist with get() = artist and set (value) = artist <- value

enter code here

I tried defining the above as a Discriminated union based on suggestions by some of F# guru's

which i defined like below

type Name = string type AlbumId = int

type Artist = | ArtistId of int | Artist of Name

type Album = | Title of string | Price of decimal | Album of AlbumId * Artist | AlbumArtUrl of string

type Genre = | GenreId of int | Genre of Name * Album list

enter code here

과 같이 데이터 구조의 무리가 있지만 지금은없는 내가 어떻게 유사 난 그냥 속성입니다 내 간단 F 번호 유형과하고 있던 내 차별 노동 조합을 채울 것입니다 알아 내기 위해? .

누군가 설명해 드릴 수 있습니까? 나는 차별적 인 노동 조합에 대해 읽었지만 나는 완전히 이해한다고 말하지는 않는다.

+1

당신이 요즘 묻고있는 모든 F # 질문을 고려할 때,이 시점에서 F #에서 위키 책을 읽는 것이 정말 가치가 있습니다. (추측 가능한 @Juliet에 의해 쓰여지거나) F #에있는 책에 투자하십시오. 줄리엣의 위키 책은 꽤 좋으므로 거기에서 시작하고 싶을 수도 있습니다. 그러나 아무 이상도 의도하지 않았다 - 당신은 약간 시간을 가지고 근본의 약간을 아래로 얻는 것을 시도하는 것이 현명 할 것이다. F #을 잘 이해하게 될 것입니다. –

답변

6

식별 된 공용체는 객체 지향 언어의 클래스 계층 구조와 대략 일치하는 여러 가지 사례가있는 유형을 나타내는 데 사용됩니다. 예를 들어, 기본 클래스 CircleRectangle 두 상속 클래스와 Shape는 다음과 같이 정의 될 수 있습니다

type Shape = 
    | Rectangle of (float * float) * (float * float) // Carries locations of two corners 
    | Circle of (float * float) * float    // Carries center and diameter 

방법은 당신이 정말로 당신은 아마 의도하지 않는 차별 노동 조합을 정의했다. 귀하의 유형은 Album, ArtistGenre은 단 하나의 구체적인 유형을 나타냅니다.

당신은 나 하나의 클래스에 해당하는 하나의 경우과 차별 노동 조합 를 사용하여 (단지 가벼운 단지 특성을 가진 클래스처럼) 중 하나를 기록 이러한를 대표하지만입니다 꽤 가벼운 구문을 가지고 있습니다 주요 이점. 예를 들어 :

type Name = string 
type Price = decimal 
type AlbumId = int 
type ArtistId = int 

type Artist = Artist of ArtistId * Name 
type Album = Album of AlbumId * Name * Price * Artist 

몇 앨범과 함께 예술가를 구성하려면, 당신은 쓸 수 있습니다 : 당신이 다음 장르를 만드는 경우, 그 앨범의 목록과의 가능한 목록을 포함

let pinkFloyd = Artist(1, "Pink Floyd") 

let darkSide = Album(1, "The Dark Side of the Moon", 12.0M, pinkFloyd) 
let finalCut = Album(2, "The Final Cut", 11.0M, pinkFloyd) 

따라서 다음과 같이 작성할 수 있습니다.

type Genre = Genre of Name * Artist list * Album list 

let rock = Genre("Rock", [pinkFloyd], [darkSide; finalCut]) 

이제 질문을 어떻게 실제로 채우겠습니까? 데이터 소스 란 무엇입니까? 데이터베이스 또는 XML 파일에서 데이터를로드하는 경우 데이터 소스의 일부를 가져와 Artist 또는 Album을 반환하는 함수를 작성하고 모든 앨범 및 아티스트를로드 한 후 Genre을 입력하고 최종 결과로 반환하십시오.

추신 : 귀하가하는 일에 대해 더 큰 그림을 실제로 제공하지 않으므로 귀하의 질문에 대답하기가 약간 어렵습니다. 작고 구체적인 예 (데이터 로딩 및 사용법 포함)를 제공 할 수 있다면 누군가가보다 기능적인 관점에서 문제를 볼 수 있도록 도와 줄 수 있습니다.

+0

오, 정말 죄송합니다 .Tomas, 내 문제/질문을 이해하기 어렵다는 의미는 아닙니다. 내가 시도하는 모든 것은이 튜토리얼 http : //mvcmusicstore.codeplex를 따르는 것이다.co.kr에서 C#으로 된 원하는 경우 pdf를 다운로드하고 응용 프로그램을 F #으로 변환 할 수 있습니다. 똑같은 응용 프로그램은 프로세스에서 함수 프로그래밍/F #을 배우기를 원합니다. – netmatrix01

+0

당신은 대답을 통해 차별적 인 노동 조합에 대한 이해와 우리가 달성 할 수있는 것을 상당히 공정하게 도와주었습니다. 그러나 내 형식이 서로 재귀적일 때 어떻게이 문제를 해결할 수 있습니다. 장르 유형에는 또한 앨범이 속성으로 포함되어 있습니다. Discriminated unions를 사용하여 도메인을 정의 할 때 이것이 가능합니까? – netmatrix01

+3

@ netmatrix01 상호 회귀 형을 사용하려면 일반적으로 돌연변이와 클래스가 필요합니다. 그러나 '장르'에 '앨범'이 저장되어 있다면 '앨범'에서 '장르'로 참조를 저장해야합니까? 예를 들어 지정된 장르의 앨범은 항상 장르 이름을 알 수 있습니다. 마찬가지로 특정 앨범을 표시 할 때 개체 구조를 살펴볼 때 장르를 항상 알 수 있습니다. 그래서 아마 이런 종류의 응용 프로그램에서 재귀 구조를 피하려고 노력할 것이라고 생각합니다. –