什么是;f(a->;b)";类型签名在Haskell中是什么意思?

什么是;f(a->;b)";类型签名在Haskell中是什么意思?,haskell,applicative,Haskell,Applicative,我试图理解Haskell中的应用程序。无法理解以下类型签名的含义: f (a -> b) 例如: foo :: Num a => Maybe (a -> a) foo = Just (+1) 我如何理解可能(a->a)的含义?它是一个函数吗?如果是,允许哪些类型的参数? 显然,我是函数式编程的新手,非常感谢您在这个主题上提供的任何资源。您可以将f(a->b)想象为一个包装在上下文中的a->b类型的函数。它主要用于Applicatives的上下文中,可能a就是一个突出的例子

我试图理解Haskell中的应用程序。无法理解以下类型签名的含义:

f (a -> b)
例如:

foo :: Num a => Maybe (a -> a)
foo = Just (+1)
我如何理解
可能(a->a)
的含义?它是一个函数吗?如果是,允许哪些类型的参数? 显然,我是函数式编程的新手,非常感谢您在这个主题上提供的任何资源。

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

Applicative
s是
Functor
s的扩展。使用
Applicative
s的典型示例是具有多个参数的函数

如果我们有两个要相加的
可能是Int
s呢。我们可以尝试使用
fmap
aka
部分应用
+
。因此,我们可以尝试:

f :: Maybe (Int -> Int)
f = (+) <$> Just 3
因此,我们可以使用它对部分应用的函数
f
应用第二个
可能Int
,方法如下:

> f <*> Just 4
Just 7

有关更多参考,请参阅函数式编程中关于learnyouahaskell的章节。

,函数与数字或任何其他类型的值没有太大区别。实际上,唯一的区别是使用函数的方式是将其应用于参数

类型的值可能A
是值
Nothing
,也可能是
Just x
,其中
x
A
类型。因此,如果你有一个类型为
的值,可能(a->a)
,就像你的
foo
,它要么是
,要么是
只有f
,其中
f
是一个函数
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
,那么它只包含
一个函数作为它的值


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

data Iso a b = Iso (a -> b) (b -> a)
Iso
甚至不是一个
函子(
Applicative
的先决条件),但它仍然非常有用。结果表明,成对函数等价于
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
一对,它会给你一个函数,反之亦然。

你知道
可能是
的意思吗?如果你知道这一点,以及
a->a
的意思,就把它们放在一起吧。这是一个
just
数据构造函数,它包装了一个类型为
Num a=>a->a
的函数(作为参数)。在Haskell中,函数是“一等公民”。你可以使用函数作为参数,返回函数,等等。在这里,它包装了一个以数字为参数的函数,并返回该数字。是的,我很清楚,我不知道在这个特殊的例子中如何使用它。好的
f(a->b)
被称为应用函数。像
这样的上下文中的函数只需(+1)
。您可以使用应用运算符
在相同的上下文值(如
Just(+1)Just 2)中对其进行操作,结果将是<代码>只有3个
。关于资源,请查看……我认为这个答案有潜在的误导性-虽然
可能
有一个
Applicative
实例,但这并不意味着
f(a->b)
对于某些任意类型的构造函数
f
必然是Applicative。
data Iso a b = Iso (a -> b) (b -> a)
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