[英]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
,其中x
是a
类型。 因此,如果您有一个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
甚至不是Functor
( Applicative
的先决条件),但它仍然非常有用。 事实证明,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
就是一个突出的例子。
Applicative
是Functor
的扩展。 使用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.