gpt4 book ai didi

haskell - 是否可以为 Arrows 而不是 ArrowApply 写下 join?

转载 作者:行者123 更新时间:2023-12-03 21:12:53 30 4
gpt4 key购买 nike

我试着写下 joinArr :: ??? a => a r (a r b) -> a r b .
我想出了一个使用 app 的解决方案,因此缩小 a下至 ArrowApply的:

joinArr :: ArrowApply a => a r (a r b) -> a r b
joinArr g = g &&& Control.Category.id >>> app
是否可以为箭头写下此功能?
我的猜测是否定的。 Control.Monad.join可能是 >>= 的一个很好的替代品在 Monad 的定义中类型类: m >>= k = join $ k <$> m .
joinArr :: Arrow a => a r (a r b) (a r b)在我们手上,可以写下 instance Arrow a => Monad (ArrowMonad a) :
m >>= k = joinArr (k <$> m)
请注意 joinArr应该稍微调整一下以便能够处理包装器。如果我们谈到 ArrowApply :
joinArr :: ArrowApply a => ArrowMonad a (ArrowMonad a b) -> ArrowMonad a b
joinArr (ArrowMonad m) = ArrowMonad $
m &&& Control.Category.id >>>
first (arr (\x -> let ArrowMonad h = x in h)) >>>
app
instance ArrowApply a => Monad (ArrowMonad a)已在 source file 中实现.
我认为这个论点不是最好的(如果它是正确的)。
我对吗?支持这一点(或反驳它)的更正式的方法是什么?

最佳答案

我认为您无法实现的正式原因 a x (a x y) -> a x y仅使用 Arrow是这需要一个应用程序的概念(正如你尝试的那样)或currying,或者在这种情况下更确切地说是uncurrying:

uncurry :: a x (a y z) -> a (x, y) z
有了这个, joinArr很简单:
joinArr :: a x (a x y) -> a x y
joinArr f = dup >>> uncurry f
where dup = id &&& id
但是如果没有 apply 我们就无法实现它, curry , 或 uncurry ,这意味着 a必须是笛卡尔闭范畴(CCC),因为我们需要一些“指数”或高阶箭头的概念, ArrowApply给我们,但是 Arrow只给了我们一个笛卡尔范畴。 (而且我相信 ArrowApply 等价于 Monad 因为 Monad 是 CCC 中的强单子(monad)。)
最接近您只能使用 ArrowApplicative ,正如您在 instance (Arrow a) => Applicative (ArrowMonad a) 的定义中看到的那样, 恰好等于 joinReader monad(从那里 join = (<*> id) ),但不是更强的 monad join :
joinArr' :: a x (x -> y) -> a x y
joinArr' f = (f &&& id) >>> arr (uncurry ($))
请注意,这里不是使用高阶箭头,而是 a x (a x y) , 我们只是重用 (->)类型。

关于haskell - 是否可以为 Arrows 而不是 ArrowApply 写下 join?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62542607/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com