2013-10-31 2 views
1

data Rectangle = Rectangle Int Int Int Int(link to gtk2hs-doc)
Rectangle에서 '너비'또는 '높이'값을 구할 생각이 없습니다.
데이터 형식의 비 명명 된 필드 값을 가져 오는 방법은 무엇입니까? 감사. Haskell에서 이름이 지정되지 않은 필드 형식의 데이터 형식을 가져 오는 방법은 무엇입니까? (gtk2hs의 사각형에서 'x' 'y'값을 얻는 방법)

내가 같은 위젯의 크기를 얻을 싶어 시도 :


무엇을

main = do 
    initGUI 
    -- . . . 
    widget <- drawingAreaNew 
    canvasArea <- newIORef $ Rectangle 0 0 defaultWidth defaultHeight 
    widget `onExpose` updateCanvas widget (liftIO (readIORef canvasArea) >>= render) 
    onSizeAllocate widget $ updateSize canvasArea 
    -- . . . 

updateSize :: IORef a -> a -> IO() 
updateSize old new = writeIORef old new 

그리고 내가 값을 얻는 방법을 알고하지 않는 것으로 나타났습니다 ...

+0

일치시킬 수 있습니까? 'let (Rectangle x y w h) = myRectangle' – bheklilr

+0

OK. 나는 기초 지식이 부족했다. 감사! – ggkuron

답변

3

이러한 매개 변수를 받고 뒤에 원리는 패턴 매칭과 같이이다 :

case rect of 
    Rectangle x y w h -> "The width is " ++ show w ++ " and the height is " ++ show h 

케이스 표현 안에 폭과 높이를 wh으로 지정합니다.

특정 설정에서 이것은 (함수에 대한 인수에 직접 패턴 일치, 패턴에 rect 값을 할당하여) 패턴 일치가 주 원칙입니다.

+0

감사합니다. 나는 그것을있어. 나는 더 많은 것을 가지고 노는거야. – ggkuron

1

더 나은는 다소 다른 Rectangle을 선언하는 것입니다 : 다음

data Rectangle = Rectangle { left, top, width, height :: Int } 

, rRectangle 경우, 당신은 그 폭을 얻을 수 width r를 작성할 수 있습니다.

을 만들려면 여전히 Rectangle 100 200 300 400을 쓸 수 있습니다.

+0

그것은 좋은 소리! .. 내가 그것을 일하게 할 수 없었던. 라이브러리의 Rectangle 가져 오기 숨김을 만들었습니다. 하지만 여전히 콜백 함수가 필요해 보인다. 'onSizeAllocate widget $ updateSize canvasArea' (내 첫 번째 게시물의 코드에 있음)의 오른쪽에 일치하는 유형을 만드는 방법을 모르겠습니다. – ggkuron

+0

GHC는 말한다 : IORef GTK-0.12.4 : ''' 이 예상 유형 ''Graphics.Rendering.Pango.Structs.Rectangle와 '유형'사각형과 일치 할 수 없습니다 Graphics.UI.Gtk.General. Structs.Allocation 실제 타입 : updateSize '의 첫번째 인수에 IORef 직사각형 ', 즉 'canvasArea'A '수행'의'STMT에서 onSizeAllocate ', 즉 '(updateSize canvasArea)' 번째 인수 블록 : onSizeAllocate da (updateSize canvasArea) ''' 'type Allocation = Rectangle' 여기에. 좋은 해결책이 있습니까? – ggkuron

+0

깨진 레이아웃은 아쉽습니다. – ggkuron