对于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报告,但我在尝试时无法找到它)?
答案 0 :(得分:4)
来自Haskell 2010 Language Report§4.1.2(类型语法),第38页:
函数类型的格式为
t1 -> t2
,等同于(->) t1 t2
类型。功能箭头与右侧相关联。例如,Int -> Int -> Float
表示Int -> (Int -> Float)
。
您可以在此处找到报告中的上下文:
答案 1 :(得分:4)
其他答案适用于标准语言,其中->
是唯一的中缀类型运算符,因此可能被视为纯语法。但是,GHC具有TypeOperators
扩展名,因此它更加微妙。 From the manual:
- 功能箭头为
infixr
,固定为0.(这可能会改变;我不确定它应该是什么。)
鉴于此,它可能被视为一个错误,它没有列出:i
的固定性。 (编辑:制作ticket。)
答案 2 :(得分:2)
- >运算符是正确的关联。这是一个记录的地方: https://wiki.haskell.org/Partial_application
有两个原因:i(>> =)和:i( - >)不同:
为什么正确的关联有意义?每当一个函数有一个函数本身的参数时,你想要明确它。以“地图”为例:
:t map
map :: (a -> b) -> [a] -> [b]
Map是一个带有两个参数的函数,第一个是类型(a - > b),所以它显然是一个函数,第二个是[a]类型。它返回[b]。我们当然可以(因为 - >是右关联的)将Map读取为类型:
map :: (a -> b) -> ([a] -> [b])
虽然这是完全相同的类型,但我们现在将map视为取一个参数,它是类型(a - > b)的函数,并返回另一个函数,类型为([a] - > ; [b])。在上面的部分应用文章中描述了这两种理解地图类型的方法。