我正在阅读 Happstack 的 Guestbook 示例,注意到了 >>
符号,这是我在学习 Haskell 时的教科书中没有见过的(例如看看第23行)。 它是什么?
我在 Google 中找不到它,因为它完全忽略了 >>
(Bing 并非如此,但显示出大量无关的结果)。
我正在阅读 Happstack 的 Guestbook 示例,注意到了 >>
符号,这是我在学习 Haskell 时的教科书中没有见过的(例如看看第23行)。 它是什么?
我在 Google 中找不到它,因为它完全忽略了 >>
(Bing 并非如此,但显示出大量无关的结果)。
在 do 表示法中
a >> b >> c >> d
等同于
do a
b
c
d
(同时,a >>= (b >>= (c >>= d))
类似于以下表达式的效果:
do r1 <- a
r2 <- b r1
r3 <- c r2
d r3
guard
(来自Contol.Monad):((\x y -> guard (y /= 0) >> pure (x / y)) 42 0) :: Maybe Double
- undefinedHayoo 可识别这种类型的运算符: http://holumbus.fh-wedel.de/hayoo/hayoo.html
(>>)
类似于 (>>=)
,用于在 Haskell 中顺序执行两个操作,但它会忽略第一个操作的结果。
>>
左侧的函数进行求值? - NearooMaybe
单子,Just 1 >> Nothing >> Just undefined
的结果是 Nothing
;对于 Either
,Right True >> Left "err" >> Left undefined
的结果是 Left "err"
;对于列表单子,[1,2,3] >> [] >> [1..]
的结果是 []
;对于 State
,let f = get >>= put . succ in execState (f >> f >> f) 0
的结果是 3
。因此,任何"状态"仍然可能会被更新,任何"异常"都会停止进一步的评估。 - lvsz在 ghci 命令提示符下,您可以输入:
:info >>
然后得到像这样的结果:
class Monad m where
...
(>>) :: m a -> m b -> m b
...
-- Defined in GHC.Base
infixl 1 >>
从那里开始,您只需查看源代码即可了解更多信息。
仅仅为了回答您的问题:
k >> f = k >>= \_ -> f
从Hackage上看,>>
的描述为:
"按顺序组合两个动作,舍弃第一个动作产生的任何值,就像命令式语言中的分号等序列操作符一样。"
我认为使用 >>
按顺序打印两个字符串是个很好的例子。在GHCI中输入以下命令:
putStr "Hello " >> putStrLn "World"
这相当于使用 do
符号的表示方法:
do putStr "Hello "
putStrLn "World"
>>
是一个用于处理单子(monads)的运算符,在Haskell中可以实现命令式编程等许多不同功能。有许多关于单子的教程可供参考,这里有一个很好的教程。a >> b
可以理解为“先做a
,然后做b
,并返回b
的结果”。这与更常见的绑定运算符>>=
类似。