haskell功能签名

use*_*128 4 haskell signature type-variables

我对haskell中的类型签名有疑问.阅读有关应用仿函数的文章,我发现:

pure (+) <*> Just 3 
Run Code Online (Sandbox Code Playgroud)

哪个回馈Just (+3)哪个类型 Maybe (a->a).现在签名<*>

 (<*>) :: Applicative f => f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

这意味着我们f b在上面的例子中取代fMaybeba->a.

在这里,我有点惊讶,因为据我所知,b无法统一(对不起,如果我没有使用指定的术语,但我希望它们足够清楚)a->a.

这是否可能只是因为我们在内部和应用程序的操作者或者我还缺少其他东西?

Dan*_*her 11

b是一个(n不受约束的)类型变量,因此它可以始终与每种类型统一.它与Applicative仿函数无关,只要类型变量必须与类型统一,它就可以工作.

粗略地说,统一两个类型表达式会导致最通用的类​​型表达式不是统一的任何一个伙伴.如果两个类型表达式中的一个比另一个更通用,则统一总是成功并且导致统一的更具体的伙伴.所有类型表达式中最常见的是一个没有任何结构的表达式,一个类型变量.因此,一个类型变量可以与任何类型的表达通过用这种类型的表达(提供的种匹配,一个类型的变量,其种类是实例化类型变量统一*当然可以不与型表达统一Maybewhise善良* -> *).

  • 反过来说.类型变量可以用每种类型实例化,可以是函数类型,列表类型,或者"IO()"或.......如果类型变量受约束,则只有具有所涉及类的实例的类型才有资格.统一的结果总是不比统一类型表达式更通用.因此,如果您将函数类型与某些内容统一,则结果也是函数类型.类型变量是可能的最通用的类​​型表达式. (2认同)

man*_*lds 7

:t pure (+)

pure (+) :: (Num a, Applicative f) => f (a -> a -> a)
Run Code Online (Sandbox Code Playgroud)

请注意 f(a -> a -> a)

那么既然:t (<*>)

(<*>) :: Applicative f => f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

f ( a -> b)实际上是一个f ( a -> a -> a).

所以b这种情况下的类型变量 a -> a