如何在Haskell中获取数据类型的非命名字段值? (如何在gtk2hs中从Rectangle获取'x''y'值?)

时间:2013-10-31 20:16:10

标签: haskell gtk2hs

data Rectangle = Rectangle Int Int Int Int (link to gtk2hs-doc)
我不知道从Rectangle获取'width'或'height'值 如何获取数据类型的非命名字段值?感谢。


为了什么:

我想获得一个小部件的大小并尝试这样:

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

并注意到我不知道获取价值的方式......

2 个答案:

答案 0 :(得分:3)

获取这些参数背后的原则是模式匹配,如下所示:

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

这会在案例表达式中为wh分配宽度和高度。

在特定设置中,这可能会缩短(通过直接在函数的参数上进行模式匹配,通过将rect值赋给模式等),但像这样的模式匹配是主要原则

答案 1 :(得分:1)

更好的是宣布Rectangle有些不同:

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

然后,如果rRectangle,您可以写width r来获取其宽度。

您仍然可以撰写Rectangle 100 200 300 400来创建Rectangle