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
并注意到我不知道获取价值的方式......
答案 0 :(得分:3)
获取这些参数背后的原则是模式匹配,如下所示:
case rect of
Rectangle x y w h -> "The width is " ++ show w ++ " and the height is " ++ show h
这会在案例表达式中为w
和h
分配宽度和高度。
在特定设置中,这可能会缩短(通过直接在函数的参数上进行模式匹配,通过将rect
值赋给模式等),但像这样的模式匹配是主要原则
答案 1 :(得分:1)
更好的是宣布Rectangle
有些不同:
data Rectangle = Rectangle { left, top, width, height :: Int }
然后,如果r
是Rectangle
,您可以写width r
来获取其宽度。
您仍然可以撰写Rectangle 100 200 300 400
来创建Rectangle
。