这是来自一些练习:
ChangeListener<Number> updater = (o, oV, nV) ->
{
root.getChildren().forEach(n ->
{
// Assuming every child is a Pane.
Pane p = (Pane) n;
p.setClip(new Rectangle(cc.getPrefWidth(), rc.getPrefHeight()));
});
};
cc.prefWidthProperty().addListener(updater);
rc.prefHeightProperty().addListener(updater);
其中Forky定义为
(<*>) :: Forky (a -> b) -> Forky a -> Forky b
通常,我在类型声明中将data Forky a = Tip a | Branch (Forky a) (Forky a)
deriving (Eq, Show)
视为一个函数。但是(a -> b)
是什么意思?
答案 0 :(得分:2)
a -> b
是和其他类型一样的类型。将其替换为Forky
声明意味着<*>
运算符的第一个参数将是Tip f
(其中f :: a -> b
)或Branch
由两个组成Forky (a -> b)
。 Forky (a -> b)
与Forky Int
相似,只是它不包含叶子的整数,而是包含函数。
答案 1 :(得分:2)
a -> b
仍然是函数类型;在这里,将类型构造函数Forky
应用于它以获取另一个类型。由于Forky a
基本上是一种包含a
值的二叉树,因此Forky (a -> b)
是包含函数的树。
请注意相似之处:
data Forky a = Tip a | Branch (Forky a) (Forky a)
data Tree a = Leaf a | Node (Tree a) (Tree a)
答案 2 :(得分:1)
这是三个功能的列表
funcs :: [Int -> Int]
funcs = [ abs, \x -> 2*x+1, (`mod` 16) ]
这是一个可能返回函数的函数:
adder :: Int -> Maybe (Int -> Int)
adder n
| n > 0 = Just (\m -> n + m)
| otherwise = Nothing
以下是一个可能将函数作为参数的函数:
applyMay :: Maybe (a -> a) -> a -> a
applyMay Nothing x = x
applyMay (Just f) x = f x