我们从类别理论中知道,并非 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 中分解?
答案 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;组成功率集的特征函数,因此协变函子是不可用的。
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 >>=
的应用程序的有限序列?