`Forky(a-> b)在类型声明中是什么意思?

时间:2018-07-11 02:53:21

标签: haskell type-declaration

这是来自一些练习:

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)是什么意思?

3 个答案:

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