2009-07-24 6 views
0

바다지도에서 깊이 곡선을 표현하기 위해 F #에서 구조체를 만들려고합니다. 그것은 좌표 목록과 어떤 깊이가 표현되는지를 나타내는 float (예 : "4.5m")를 포함해야합니다. 나는이 방법을 만들었습니다 :바다지도에서 깊이 곡선 구조

type Coord = 
    struct 
     val X : float 
     val Y : float 
     new(x,y) = { X = x ; Y = y } 
    end 

type DepthCurve = 
    struct 
     val Coords : list<Coord> 
     val Depth : float 
     new(list_of_Coords, depth) = { Coords = list_of_Coords ; Depth = depth} 
    end 

let myCoord1 = new Coord(1.,2.) 
let myCoord2 = new Coord(3.,4.) 
let myDepthCurve = new DepthCurve([myCoord1;myCoord2] , 5.) 

내 문제는이 날과 같이 한 번에 다각형과 그 좌표를 만들 수 없다는 것입니다 :

let myDepthCurve = {coords=[[1.;2.];[3.;4.]] , 5} 

위한 솔루션이 존재 이 :

type Coord = { X : float; Y : float } 
type 'a DepthCurve = {coords: 'a list;} 
let myDepthCurve = {coords=[[1.;2.];[3.;4.]]};; 

하지만 그것은 나뿐만 아니라 구조체의 깊이를 나타내는 플로트를하지 않으며, 그것은 나를 좌표 만 할 목록의 종류를 제한하지 않습니다.

두 세계의 장점을 어떻게 결합합니까?

답변

1

생성 한 객체 유형은 생성자가있는 표준 .NET 구조입니다. 특수 F # -record-initialization sytnax ({ ... })가 없습니다.

문제에 대한

, 당신은 단지 약간의 래퍼 함수 작성할 수 단축 기록 구문에 구조를 선언 할 때는

let curve depth coords = New DepthCurve([for (x, y) in coords -> New Coord(x, y)], depth) 

와 같은 기능을이

let testCurve = curve 10. [(1., 2.); (3., 4.); ...] 

,이처럼해야 :

type Coord = float * float // Type-alias for a 2D-float-tuple 
type DepthCurve = { coords : Coord list; depth : float } 

let myCurve = { coords = [(1., 2.); ...], depth = 42. } 

일반 목록을 사용해야하는 이유는 없습니다. Coord list (의미 : List of Coords)을 지정하십시오. 목록 ([1; 2; 3])과 튜플 ((1, 2, 3))의 차이점에 유의하십시오. 후자는 코디를 나타내는 데 훨씬 적합합니다.

은 F 번호의 구조와 유형에 대한 this article에서 봐 주시기 바랍니다.

+0

을이 정말 좋다 . 이렇게하면 짧은 표기법과 치즈가 있습니다. – loldrup

+0

... 내 VS 2008에서 작동하지 않는 것을 제외하고는 다음과 같습니다. – loldrup

+0

내 전체 답장보기 myCurve에서 코드와 심도 멤버를 구분하는 쉼표는 세미콜론이어야합니다. – kvb

0

대답은 프로그램을 만드는 방식에 따라 다릅니다. 당신이 간단한 객체 계층 구조를 만들 수 있습니다 OOP를 선호하는 경우에

(* tuple with type constractor and any getters you need: *) 
let makeCoord x y = (x,y) 
let makeCurve depth coords = (depth,coords) 
let addCurveCoord (depth,coords) coord = (depth, coord::coords) 
let getCurveDepth (depth,_) = depth 
let getCurveCoords (_,coords) = coords 
let getFirstCurveCoord (_,coords) = List.hd coords 
//... 

(* or types described by Dario *) 
(* or tagged unions for case you need specific access to parts of your data *) 

:

는 경우를 들어 당신은 activly 내가 세 가지 선택에 대한 투표 기능 패러다임 (NO 돌연변이, 상위 기능, 패턴 매칭)를 사용합니다.

FP의 주된 장점은 프로그램 수립의 모든 단계에서 디자인을 쉽게 수정할 수 있다는 것입니다. 물론 그것은 명백한 국가 주장에 의해 비용이 들게됩니다. 내가 VS 2008 년에이를 작성할 때

:하지만 모나드 표현 :

+0

필자는 함수형 프로그래밍을 선호한다. 나는 곧 당신의 제안을 살펴볼 것이다. – loldrup

+0

당신의 기능적 해결책에 대한 걱정은 명백한 유형의 부족이다. 커브처럼 보이는 것은 모두갑니다. – loldrup

+0

태그가없는 튜플은 많은 유사한 데이터 구조가 있지만 유형 및 태그가 지정된 공용체를 사용할 수있는 최상의 선택이 아닙니다. – ssp

-1

다리오에 의해 그들을 이길 수

type Coord = float * float // Type-alias for a 2D-float-tuple 
type DepthCurve = { coords : Coord list; depth : float } 

let myCurve = { coords = [(1., 2.); (3., 4.)], depth = 42. } 

을 내가 theese 오류를 얻을 :

This expression has type 'a * 'b but is here used with type Coord list 
no assignment given for field 'depth' 
+0

myCurve에서 코드와 깊이 멤버를 구분하는 쉼표는 세미콜론이어야합니다. – kvb