相关性 - >

时间:2015-03-07 15:10:50

标签: haskell

对于monad绑定运算符,我可以发现它的关联性来自ghci使用:

λ> :i (>>=)
class Monad (m :: * -> *) where
  (>>=) :: m a -> (a -> m b) -> m b
  ...
    -- Defined in ‘GHC.Base’
infixl 1 >>=

但同样适用于->

λ> :i (->)
data (->) a b   -- Defined in ‘GHC.Prim’
instance Monad ((->) r) -- Defined in ‘GHC.Base’
instance Functor ((->) r) -- Defined in ‘GHC.Base’

在哪里确切地记录了它的相关性(欢迎链接到Haskell报告,但我在尝试时无法找到它)?

3 个答案:

答案 0 :(得分:4)

来自Haskell 2010 Language Report§4.1.2(类型语法),第38页:

  

函数类型的格式为t1 -> t2,等同于(->) t1 t2类型。功能箭头与右侧相关联。例如,Int -> Int -> Float表示Int -> (Int -> Float)

您可以在此处找到报告中的上下文:

Image showing the context in which the quote above was taken

答案 1 :(得分:4)

其他答案适用于标准语言,其中->是唯一的中缀类型运算符,因此可能被视为纯语法。但是,GHC具有TypeOperators扩展名,因此它更加微妙。 From the manual

  
      
  • 功能箭头为infixr,固定为0.(这可能会改变;我不确定它应该是什么。)
  •   

鉴于此,它可能被视为一个错误,它没有列出:i的固定性。 (编辑:制作ticket。)

答案 2 :(得分:2)

- >运算符是正确的关联。这是一个记录的地方: https://wiki.haskell.org/Partial_application

有两个原因:i(>> =)和:i( - >)不同:

  • (>> =)是一个函数,但是( - >)只能出现在一个函数中 功能
  • (>> =)实际上是在某处定义的(对于每个Monad类型), 但是( - >)是内置的

为什么正确的关联有意义?每当一个函数有一个函数本身的参数时,你想要明确它。以“地图”为例:

:t map
map :: (a -> b) -> [a] -> [b]

Map是一个带有两个参数的函数,第一个是类型(a - > b),所以它显然是一个函数,第二个是[a]类型。它返回[b]。我们当然可以(因为 - >是右关联的)将Map读取为类型:

map :: (a -> b) -> ([a] -> [b])

虽然这是完全相同的类型,但我们现在将map视为取一个参数,它是类型(a - > b)的函数,并返回另一个函数,类型为([a] - > ; [b])。在上面的部分应用文章中描述了这两种理解地图类型的方法。