我有这个简单的“箭头”:
main = do
let
-- arr :: (Arrow a) => (b -> c) -> a b c
-- (>>>) :: Category cat => cat a b -> cat b c -> cat a c
-- (<+>) :: ArrowPlus a => a b c -> a b c -> a b c
-- infixr 5 <+>
-- infixr 1 >>>
-- runKleisli :: Kleisli m a b -> a -> m b
prepend x = arr (x ++)
append x = arr (++ x)
xform = (prepend "<") >>> (append ">") <+> (prepend "{") >>> (append "}")
xs = ["foobar"] >>= (runKleisli xform)
mapM_ putStrLn xs
<+>
返回:
<foobar>}
{<foobar}
如果我替换 xform
与:
xform = ((prepend "<") >>> (append ">")) <+> ((prepend "{") >>> (append "}"))
我得到:
<foobar>
{foobar}
为什么我得到这 2 个结果?即使看着infixr
s(作为代码中的注释)并没有真正的帮助。
最佳答案
让我们写得更切题一点:
xform = prepend "<" >>> append ">" <+> prepend "<" >>> append ">"
xform' = (prepend "<" >>> append ">") <+> (prepend "<" >>> append ">")
现在xform
,因为infixr 5 <+>
比 infixl 1 >>>
结合得更紧密,被解析为
xform = prepend "<" >>> (append ">" <+> prepend "<") >>> append ">"
如图所示
┌─append ">"──┐
──────prepend "<"─────< +>═══append ">"═════▶
└─prepend "<"─┘
而xform'
简单地对应于
┌─prepend "<"──append ">"─┐
───────< +>════▶
└─prepend "<"──append ">"─┘
这应该可以解释它。
关于haskell - 在箭头上应用幺半群时出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41337207/