gpt4 book ai didi

haskell - 自由单子(monad)和自由操作

转载 作者:行者123 更新时间:2023-12-04 13:59:00 25 4
gpt4 key购买 nike

描述 Free monad 的一种方法是说它是 endofunctors 类别中的初始幺半群(某些类别 C ),其对象是来自 C 的 endofunctors至C , 箭头是它们之间的自然变换。如果我们采取C成为 Hask ,内仿函数就是所谓的Functor在 haskell 中,它们是来自 * -> * 的仿函数在哪里 *表示 Hask 的对象

根据初始值,来自 endofunctor t 的任何映射到幺半群 mEnd(Hask)Free t 导出 map 至m .

否则,从 Functor t 的任何自然转换到 Monad mFree t 诱导自然转变至m
我本来希望能够编写一个函数

free :: (Functor t, Monad m) => (∀ a. t a → m a) → (∀ a. Free t a → m a)
free f (Pure a) = return a
free f (Free (tfta :: t (Free t a))) =
f (fmap (free f) tfta)

但这无法统一,而以下工作
free :: (Functor t, Monad m) => (t (m a) → m a) → (Free t a → m a)
free f (Pure a) = return a
free f (Free (tfta :: t (Free t a))) =
f (fmap (free f) tfta)

或其带有签名的概括
free :: (Functor t, Monad m) => (∀ a. t a → a) → (∀ a. Free t a → m a)

我在范畴论中犯了错误,还是在翻译到 Haskell 时犯了错误?

我很想在这里听到一些智慧..

PS:启用该代码的代码
{-# LANGUAGE RankNTypes, UnicodeSyntax #-}
import Control.Monad.Free

最佳答案

Haskell 的翻译似乎是错误的。一个很大的提示是您的 free实现不在任何地方使用单子(monad)绑定(bind)(或连接)。您可以找到free foldFree 具有以下定义:

free :: Monad m => (forall x. t x -> m x) -> (forall a. Free t a -> m a)
free f (Pure a) = return a
free f (Free fs) = f fs >>= free f

关键是 f专攻 t (Free t a) -> m (Free t a) ,从而消除了一个 Free一下子一层一层。

关于haskell - 自由单子(monad)和自由操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34575522/

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