什么是;f(a->;b)";类型签名在Haskell中是什么意思?
我试图理解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就是一个突出的例子
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