haskell - 在箭头上应用幺半群时出现意外结果

标签 haskell arrows

我有这个简单的“箭头”:

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/

相关文章:

haskell - 我可以在 Haskell 中将数字全局限制为只有 3 位小数吗?

javascript - 是否可以从 JavaScript 调用 hamlet?

haskell - 与 Netwire 一起使用时对 ArrowLoop 的误解

css - 动画图标在关键帧期间向左移动

haskell - ArrowLoop 是如何工作的?另外,mfix?

haskell - haskell在lambda中嵌套let

haskell - 这两个非常相似的 haskell 状态计算有什么区别

haskell - 带分隔符的秒差距置换解析器

haskell - profunctors和箭头有什么关系?

haskell - (\f -> fmap f id) 是否总是等价于 arr?