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在上面的例子中取代f了Maybe并b用a->a.
在这里,我有点惊讶,因为据我所知,b无法统一(对不起,如果我没有使用指定的术语,但我希望它们足够清楚)a->a.
这是否可能只是因为我们在内部和应用程序的操作者或者我还缺少其他东西?
Dan*_*her 11
b是一个(n不受约束的)类型变量,因此它可以始终与每种类型统一.它与Applicative仿函数无关,只要类型变量必须与类型统一,它就可以工作.
粗略地说,统一两个类型表达式会导致最通用的类型表达式不是统一的任何一个伙伴.如果两个类型表达式中的一个比另一个更通用,则统一总是成功并且导致统一的更具体的伙伴.所有类型表达式中最常见的是一个没有任何结构的表达式,一个类型变量.因此,一个类型变量可以与任何类型的表达通过用这种类型的表达(提供的种匹配,一个类型的变量,其种类是实例化类型变量统一*当然可以不与型表达统一Maybewhise善良* -> *).
: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