函数的句法正确性

时间:2013-07-28 03:53:05

标签: haskell

以下是函数的定义:

fmap :: (a -> b) -> f a -> f b

你们能解释一下它究竟意味着什么吗?我不明白的是f af b:为什么可以这样写?我的意思是,为什么它的语法正确且编译得很好?

我认为应该只有一个变量(a -> b) -> a -> b(a -> b) -> f -> f或其他(a -> b) -> c -> d

再一次,问题不是关于函数的意义,而是关于语法的正确性。

3 个答案:

答案 0 :(得分:7)

您是否接受“普通”map函数map :: (a -> b) -> [a] -> [b]的签名?

现在假装我们写了[a]而不是List a(与Maybe a比较),以便签名读取map :: (a -> b) -> List a -> List b。此签名位于(a -> b) -> f a -> f b表单f = List

函数fmap :: (a -> b) -> f a -> f bmapMaybe等其他类型构造函数的推广。

答案 1 :(得分:4)

井Haskell [1]类型签名由3个元素组成

  • 类型变量。
    • 它们被隐含地普遍量化。从语法上讲,它们以小写字母开头。
  • 具体类型。
    • 它们是填充类型变量的实际“东西”。它们以大写字母开头。
  • 功能箭头。
    • 这代表了功能。这是咖喱和等等等等。从语法上讲,这是一个箭头。

现在你的例子我们有2个元素。 abf是类型变量,然后我们有函数箭头。

ab具有*种类,这意味着它们可以按具体类型实例化。另一方面,f具有类型* -> * [2]。这意味着f无法以与ab相同的方式进行实例化。需要使用类型为*的类型进行实例化,然后生成具体类型。

例如,在构造该类型的值之前,必须为Maybe提供另一种类型,例如Int。例如Just 1 :: Maybe Intwat :: Maybe没有意义。因此,应用f a与将值函数f应用于值a相同,但类型除外。你甚至有部分申请!

因此,请将f a -> f b视为“将某种类型f设为某种类型a的函数,并将其应用于某些类型f,并返回应用于某些类型b的值输入->“。

[1] Haskell我的意思是vanilla haskell。类型运算符,排名N类型等使事情变得复杂。

[2]这是正常函数{{1}}。它谈论的是类型而不是价值观。

答案 2 :(得分:2)

Haskell中的语法Type1 Type2意味着类型的应用。例如,您可能已经看到类型Maybe Integer。它的工作原理是因为Maybe定义如下:

data Maybe a = ...

请注意类型变量a。这意味着我们必须将Maybe应用于某种类型才能将其用作类型本身。在Maybe Integer中,此a设置为Integer

现在在问题中,我们有f a,即类型变量应用于另一个类型变量。这意味着f可能类似Maybe,可能会应用于另外一种类型,而a可能类似于Integer类型。< / p>