wxHaskell库中的嵌套Lambda

时间:2012-11-17 22:28:02

标签: haskell wxwidgets wxhaskell

我一直试图弄清楚如何使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。

2 个答案:

答案 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

这是否足以明确遵循流程?我还没有尝试过了解initialWindowinitialText