1

data Rectangle = Rectangle Int Int Int Int (链接到 gtk2hs-doc)
我不知道从Rectangle.
如何获取数据类型的非命名字段值?谢谢。


为了什么:

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

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

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

4

2 回答 2

3

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

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

这会将宽度和高度分配给case 表达式w及其h内部。

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

于 2013-10-31T20:24:01.947 回答
1

更好的是声明Rectangle有所不同:

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

然后,如果r是 a Rectangle,您可以编写width r以获取其宽度。

你仍然可以写Rectangle 100 200 300 400来创建一个Rectangle.

于 2013-10-31T21:17:38.413 回答