自由单子总是存在吗?

时间:2016-01-02 11:19:24

标签: haskell category-theory free-monad

我们从类别理论中知道,并非 Set 中的所有endofunctors都承认一个免费的monad。规范的反例是powerset仿函数。

但是Haskell可以将任何仿函数变成一个免费的monad。

data Free f a = Pure a | Free (f (Free f a))
instance Functor f => Monad (Free f) where
  return = Pure
  Pure a >>= f = f a
  Free m >>= f = Free ((>>= f) <$> m)

是什么让这个构造适用于任何Haskell仿函数,但在 Set 中分解?

2 个答案:

答案 0 :(得分:4)

很明显,这个答案错误。我将其留在此处以便在评论中保留有价值的讨论,直到有人制定正确的答案为止。

考虑f : S -> T中的权力集。如果我们有f' : PS S -> PS T函数,我们可以f' X = f [X]形成f'' X = f^(-1) [X]。好协变仿函数(我认为)。我们也可以形成newtype PS t = PS (t -> Bool) ,一个不错的逆变函子(我认为)。

让我们看看&#34;电源组&#34;在哈斯克尔:

Functor

一个Contravariant,但只有一个instance Contravariant PS where contramap f (PS g) = PS (g . f)

t

我们认识到这一点,因为Set处于负面位置。与Set不同,我们无法理解&#34;元素&#34;组成功率集的特征函数,因此协变函子是不可用的。

因此,我猜想Haskell为每个协变仿函数承认一个免费monad的原因是它排除了导致override func viewDidLoad() { super.viewDidLoad() let navigationBar = UINavigationBar(frame: CGRectMake(0, 0, self.view.frame.size.width, 44)) navigationBar.backgroundColor = UIColor.whiteColor() navigationBar.delegate = self let navigationItem = UINavigationItem() navigationItem.title = "Title" let leftButton = UIBarButtonItem(title: "Save", style: UIBarButtonItemStyle.Plain, target: self, action: "btn_clicked:") let rightButton = UIBarButtonItem(title: "Right", style: UIBarButtonItemStyle.Plain, target: self, action: nil) navigationItem.leftBarButtonItem = leftButton navigationItem.rightBarButtonItem = rightButton navigationBar.items = [navigationItem] self.view.addSubview(navigationBar) } 出现问题的协变仿函数。

答案 1 :(得分:1)

我(相当)怀疑这不完全是一个定义。 比如说,这个递归公式指定了 a 修复点;现在,我们怎么知道这个修复点存在?我们怎么知道只有一个修复点?此外,introjs.setOptions({ steps: [ { element: '.element1', intro: 'Lorem ipsum...', position: 'bottom' }, { element: '.element2', intro: 'Lorem ipsum...', position: 'top' } ] }); 如何定义任何内容,除非我们假设我们只有Free m >>=的应用程序的有限序列?