【问题标题】:It's not a monad, but what is it?它不是单子,但它是什么?
【发布时间】:2013-06-06 17:33:06
【问题描述】:

According to the Haskell wikibook,一个名为mMonad 是一个带有两个额外操作的Functor

unit :: a -> m a
join :: m (m a) -> m a

这很好,但我有一些不同的东西。忽略血淋淋的细节,我有一个具有良好 unitjoin 功能的类型,但它的 fmap 表现不佳(fmap g . fmap f 不一定是 fmap (g.f))。因此,它不能成为Monad 的实例。尽管如此,我还是想给它尽可能多的通用功能。

所以我的问题是,什么类别的理论结构类似于单子,因为它们有 unitjoin

我意识到在某种程度上,上述问题定义不明确。对于 monad,unitjoin 定义仅在 fmap 定义方面才有意义。如果没有fmap,您将无法定义任何单子定律,因此unit/join 的任何定义都将同样“有效”。所以我正在寻找除 fmap 之外的函数,在这些 unitjoin 函数上定义一些“非单子”法则可能是有意义的。

【问题讨论】:

  • 您能否详细描述一下您拥有的结构,特别是什么导致它无法满足fmap 的融合定律?
  • 我想你专门“调整”fmap 以使join 满足第二个单子定律?通常,您几乎总是会自动获得fmap g . fmap f ≡ fmap $ f.g
  • @luqui 我对一般情况更感兴趣,而不仅仅是这种特殊情况,但它是一个正态分布。如果您认为fmap 将函数应用于分布中的每个点,那么fmap 只遵循Functor 的加法和乘法定律。 unit 正在对单个数据点进行训练,join 正在将“正态分布的正态分布”合并为单个正态分布。显然,这需要对参数进行一些限制,因此使用Base 类型类根本无法完成,我一直在使用ConstraintKinds 来玩弄它。
  • 众所周知,“单子只是内函子范畴中的幺半群”。所以你正在寻找一个monoid,只是在一个不同的类别中。我不确定哪个类别对应于正态分布,但我有点怀疑。我的直觉(通常是错误的 FWIW)是正态分布强加的唯一结构与 List 同构。
  • 您的正常分发应用程序听起来与我尝试使用的 an uncertainty-propagation type 非常相似。我想我检查了它是否遵守函子定律,如果你用微分定律获得结果宽度!当然,当分布宽度保持足够小以至于您可以忽略高阶泰勒加法时;否则整个方法似乎并不是很有用。

标签: haskell monads category-theory


【解决方案1】:

这是你应该拥有的一条法则,只有 unitjoin。给定x :: m a

join (unit x) = x

为了证明这不是凭空而来的,让我们从现有的单子定律开始:

return x >>= f = f x

鉴于m >>= f = join (fmap f m)

join (fmap f (return x)) = f x

选择f = id

join (fmap id (return x)) = id x

使用fmap id = id的函子定律

join (id (return x)) = id x

使用明显的id a = a

join (return x) = x

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    相关资源
    最近更新 更多