我一直试图弄清楚如何使staticText元素调整大小以适应wxHaskell的内容。据我所知,这是wxWidgets中的默认行为,但wxHaskell包装器专门禁用此行为。但是,创建新元素的库代码让我非常困惑。任何人都可以解释这段代码的作用吗?
staticText :: Window a -> [Prop (StaticText ())] -> IO (StaticText ())
staticText parent props
= feed2 props 0 $
initialWindow $ \id rect ->
initialText $ \txt -> \props flags ->
do t <- staticTextCreate parent id txt rect flags {- (wxALIGN_LEFT + wxST_NO_AUTORESIZE) -}
set t props
return t
我知道feed2 x y f = f x y
,并且initialWindow的类型签名是
initialWindow :: (Id -> Rect -> [Prop (Window w)] -> Style -> a) -> [Prop (Window w)] -> Style -> a
并且initialText的签名是
initialText :: Textual w => (String -> [Prop w] -> a) -> [Prop w] -> a
但我无法绕过所有的lambdas。
答案 0 :(得分:2)
在Haskell中,一切都是嵌套的lambdas! <{1}}与\txt -> \props flags -> do {...}
相同,两者实际上都是
\txt props flags -> do {...}
这里有点令人困惑的是,\txt -> \props -> \flags -> do {...}
似乎涉及许多论点:
\txt props flags
似乎采用了2参数函数,我们给它一个三参数lambda。但请记住:实际上,每个函数只接受一个参数,其他一切都是通过currying完成的。在这种情况下,initialText :: ...=> (String -> [Prop w] -> a) -> ...
也是一个函数类型,因此实际应该读取
a
这不是乐趣的结束。 initialText :: Textual w => (String -> [Prop w] -> b -> c) -> [Prop w] -> b -> c
的参数似乎必须是小参数,而不是4,但情况并非如此:我们只给了initialWindow
它的第一个参数,结果是一个函数,它接受initialWindow
之前的更多参数(在这种情况下,[Prop w]
的签名中为[Prop(Window w)]
)。然后它返回initialWindow
,我们重写为a
;在这种情况下,b->c
需要的是initialWindow
。
因此,此应用程序中Style -> a
的实际签名将是
initialText
答案 1 :(得分:2)
我没有使用的WX库似乎在内部使用奇怪的回调或继续传递样式。这个阴影props
以一种令人困惑的方式,让我重命名那个吸盘:
staticText1 :: Window a -> [Prop (StaticText ())] -> IO (StaticText ())
staticText1 parent propsTopLevel
= feed2 propsTopLevel 0 $
initialWindow $ \id rect ->
initialText $ \txt -> \propsParam flags ->
do t <- staticTextCreate parent id txt rect flags
set t propsParam
return t
没有($)我可以使用括号:
staticText2 :: Window a - &gt; [Prop(StaticText())] - &gt; IO(StaticText()) staticText2 parent propsTopLevel = feed2 propsTopLevel 0(initialWindow(\ id rect - &gt; initialText(\ txt - &gt; \ propsParam flags - &gt; do t&lt; - staticTextCreate parent id txt rect flags 设置道具 返回t)))
\text -> \props flags ->
之类的lambda可以命名为:
staticText3 :: Window a -> [Prop (StaticText ())] -> IO (StaticText ())
staticText3 parent propsTopLevel = initialWindow myWindow propsTopLevel 0
where makeWindow id rect = initialText myText
where myText txt propsParam flags = do
t <- staticTextCreate parent id txt rect flags
set t propsParam
return t
在staticText3
我使用嵌套的词法范围作为参数名称。让我更明确一点:
staticText4 :: Window a -> [Prop (StaticText ())] -> IO (StaticText ())
staticText4 = makeWindowTextStatic where
makeWindowTextStatic parent propsTopLevel = initialWindow (makeTextStatic parent) propsTopLevel 0
makeTextStatic parent id rect = initialText (makeStatic parent id rect)
makeStatic parent id rect txt propsParam flags = do
t <- staticTextCreate parent id txt rect flags
set t propsParam
return t
这是否足以明确遵循流程?我还没有尝试过了解initialWindow
和initialText
。