繁体   English   中英

在应用程序的上下文中理解Haskell类型系统

[英]Understanding the Haskell type system in the context of applicatives

我正在使用Control.Applicative ,我意识到我不了解Haskell类型系统的所有内容。

这是我在Ghci的实验:

λ :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b

λ :t (<*>) (pure 2)
(<*>) (pure 2) :: (Num (a -> b), Applicative f) => f a -> f b

<*>的第一个参数的类型是f (a -> b)

  • 为什么这个表达正确?
  • 它是如何与(pure 2)统一的,因为常数2不是a -> b的类型?
  • Num (a -> b)是什么意思? 具有a a -> b类型的函数如何成为Num的实例?

<*>的第一个参数应该是f (a -> b) 所以给定(<*>) (pure x) ,只要x是某种函数,这是很好的类型。

2的类型是Num a => a 换句话说, 2可以是任何可能的类型 ,只要它是Num的实例。

所以在你的表达式(<*>) (pure 2) ,如果2的类型是函数类型,并且该函数类型具有Num实例,则这是良好类型的。

当然,几乎没有理由要求函数拥有Num实例。 但是编译器不知道这一点。 所有它的说法是, 如果有这样的实例,那么表达式将变得很好。

(这类似于你有时会看到编译器希望某些类型同时成为IntegralFractional实例的错误。对于人类来说,这是一个荒谬的组合。对于一台机器,它们只是两个普通的类...... )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM