首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[]的MonadFix实例

[]的MonadFix实例
EN

Stack Overflow用户
提问于 2016-07-03 09:55:27
回答 1查看 325关注 0票数 6

实例定义为

代码语言:javascript
复制
instance MonadFix [] where
  mfix f = case fix (f . head) of
             []    -> []
             (x:_) -> x : mfix (tail . f)

但是,我没有理解它背后的直觉意义,对于被视为非确定性计算的[] monad来说。在mfix f函数中,f的参数不能严格,因此不能检查参数。而且根据定义,它也不能在输出的任何地方使用参数,否则在某个时候会碰到fix (f . head)和发散。那么,除了mfix之外,mfix (const someList)对列表有什么用处(或好的例子)吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-03 13:59:52

这样说可能是最简单的。完全定义了f的函数mfix f是指f x的脊柱不依赖于x的函数,因此它们可以用形式编写。

代码语言:javascript
复制
f x = [f1 x, ..., fn x]

对于一些n (可能无穷大)和一些f1,.,fn。然后

代码语言:javascript
复制
mfix f = [fix f1, ..., fix fn]

(当然,要真正完全定义这一点,还必须定义每个fix fi )。

mfix可以被认为是非确定性的,给出了非确定性函数的不动点。比较严重的限制是非确定性计算的形状不能以任何方式依赖于输入。为了开始计算,我们似乎需要对计算进行某种限制,但您可能希望至少能够有条件地关闭计算的一个分支(例如,如果某些中间计算为负数)。我一直认为用这种方式使用mfix应该是可能的,方法是使用不同的非确定性monad,它的选择操作不是关联的,但从未计算出细节。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38168764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档