繁体   English   中英

Haskell 中的“f (a -> b)”类型签名是什么意思?

[英]What does “f (a -> b)” type signature mean in Haskell?

我试图了解 Haskell 中的应用程序。 无法弄清楚以下类型签名是什么意思:

f (a -> b)

例如:

foo :: Num a => Maybe (a -> a)
foo = Just (+1)

我如何理解Maybe (a -> a)的含义? 是 function 吗? 如果是,允许使用哪些类型的 arguments? 同样显然我是函数式编程的新手,将不胜感激有关此主题的任何资源。

在函数式编程中,函数与数字或任何其他类型的值没有太大区别。 真正唯一的区别是您使用 function 的方式是将其应用于参数。

Maybe a类型的值要么是Nothing要么是Just x ,其中xa类型。 因此,如果您有一个Maybe (a -> a)类型的值,就像您的foo一样,它要么是Nothing ,要么是Just f ,其中f是 function a -> a 以最不花哨的方式,您可以像这样使用它:

case foo of
    Nothing -> "There was no function"
    Just f -> "There was a function, and its value at 0 is " ++ show (f 0)

因此,如果事实证明foo不是Nothing ,那么它包含Just a function 作为其值。


@Erich 是对的,尤其是字面表达式f (a -> b)可能与应用函子有关,但不一定如此。 例如,我最喜欢的类型是同构类型——两种类型之间的等价:

data Iso a b = Iso (a -> b) (b -> a)

Iso甚至不是FunctorApplicative的先决条件),但它仍然非常有用。 事实证明,pairs 等价于Bool中的函数。 我们可以将这样的等价构造为Iso值:

pairEquiv :: Iso (a,a) (Bool -> a)
pairEquiv = 
    Iso (\(x,y) -> \b -> if b then x else y) -- from pair to function
        (\f -> (f True, f False))            -- from function to pair

这里(Bool -> a)作为类型构造函数的参数出现,它只是意味着如果你给Iso一对,它会给你一个 function 回来,反之亦然。

您可以将f (a -> b)想象为包装在上下文中的a -> b类型的 function。 它主要用于Applicative的上下文中, Maybe a就是一个突出的例子。

ApplicativeFunctor的扩展。 使用Applicative的典型示例是具有多个 arguments 的函数。

如果我们有两个想要相加的Maybe Int怎么办。 我们可以尝试通过fmap aka <$>部分应用+ 因此我们可以尝试:

f :: Maybe (Int -> Int)
f = (+) <$> Just 3

但是现在,我们如何将其应用于第二个论点。 这就是我们需要Applicative类型类的地方。 它定义了<*> function。 它有类型

<*> :: Applicative f => f (a -> b) -> f a -> f b

因此,我们可以使用它对我们部分应用的 function f应用第二个Maybe Int ,方法是:

> f <*> Just 4
Just 7

如果没有帮助器 function f ,语法类似于标准 function 应用程序:

> (+) <$> Just 3 <*> Just 4
Just 7

如需进一步参考,请参阅关于 learnyouahaskell 的应用函子的章节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM