Questions tagged «functional-programming»

2
一组部分有序元素的持久数据结构是什么?
我需要存储类型为a的元素集。类型a是部分排序的,因此比较和可以返回更小,更大,相等或不可比的结果。一种1个一种1个a_1一种2一种2a_2 哈希表的一个问题是,两个相等的元素可以用不同的方式表示,并且我无法访问与相等一致的哈希函数。 比较两个元素可能是一个漫长的过程,因此最小化比较会很有趣。如果需要,可以记住对比较运算符的调用。我现在意识到,我只需要存储反链(或者假设是这样)。更准确地说,我将需要执行的操作如下: 从反链中删除一个元素; 尝试添加一个元素。如果元素小于成员,则不要添加它,否则,添加它并删除所有小于它的元素。 我还可以用两个整数来绑定每个元素,因此,如果我知道和,那么知道立刻给我。当然,并不意味着 ...与完整的元素比较相比,找到整数范围是一个相对便宜的操作。一世1个&lt; a &lt; 我2一世1个&lt;一种&lt;一世2i_1 < a < i_2一世3&lt; b &lt; 我4一世3&lt;b&lt;一世4i_3 < b < i_4一世2&lt; 我3一世2&lt;一世3i_2 < i_3a &lt; b一种&lt;ba < b一世2≮ 我3一世2≮一世3i_2 \not< i_3一≮ b一种≮ba \not < b


1
为什么函数式编程语言需要垃圾回收?
是什么阻止ghc将Haskell转换为连接编程语言(例如组合逻辑),然后仅对所有内容使用堆栈分配?根据Wikipedia的说法,从lambda演算到组合逻辑的转换是微不足道的,而且,级联编程语言可以仅依靠堆栈来进行内存分配。进行这种翻译从而消除Haskell和ocaml等语言的垃圾回收是否可行?这样做有不利之处吗? 编辑:移到这里/programming/39440412/why-do-functional-programming-languages-require-garbage-collection

1
类型类的数学(分类)描述
可以将功能语言视为一种类别,其中它的对象是类型,而词素之间是功能。 类型类如何适合此模型? 我假设我们应该只考虑那些满足大多数类型类所具有的约束但在Haskell中未表达的约束的实现。例如,我们应该只考虑Functor针对fmap id ≡ id和的那些实现fmap f . fmap g ≡ fmap (f . g)。 还是类型类型有其他理论基础(例如基于类型化的lambda计算)?


3
关联哈希混合
考虑纯功能设置中的单链链接。它的赞美声从山顶传来,并将继续传给人们。在这里,我将讨论其众多优势之一,以及如何将其扩展到基于树的更广泛的纯功能序列类别的问题。 问题如下:您想通过强哈希在O(1)时间内测试几乎某些结构相等性。如果哈希函数在结构上是递归的,即哈希(x:xs)=混合x(哈希xs),则可以将哈希值透明地缓存在列表中,并在元素被限制在现有列表中的情况下,在O(1)时间更新它们。大多数哈希列表算法在结构上都是递归的,因此这种方法在实践中非常有用。 但是,假设您不是基于单链列表,而是具有基于树的序列,该序列支持在O(log n)时间内连接两个长度为O(n)的序列。为了使散列缓存在这里起作用,散列混合函数必须具有关联性,以便尊重树在表示相同线性序列时所具有的自由度。混合器应获取子树的哈希值,并计算整个树的哈希值。 这是六个月前的一天,当时我花了一天时间思考并研究这个问题。在有关数据结构的文献中似乎没有引起注意。我确实遇到了来自密码学的Tillich-Zemor哈希算法。它依赖于2x2矩阵乘法(关联),其中位0和1对应于在Galois字段中具有条目的子代数的两个生成器。 我的问题是,我错过了什么?我在搜索中找不到的关于密码学和数据结构的文献中必定有相关的论文。任何对此问题的评论以及可能探索的场所将不胜感激。 编辑:我对频谱的软性和加密性强端都对这个问题感兴趣。在较软的方面,它可以用于哈希表,在该表中应避免冲突,但不会造成灾难性的后果。从更有利的方面,它可以用于相等性测试。

2
功能编程中的差异列表
问题自Okasaki以来,纯功能数据结构有何新变化?和jbapple的史诗答案,提到了在函数编程中使用差异列表(与逻辑编程相对),这是我最近感兴趣的事情。这使我找到了Haskell 的差异列表实现。我有两个问题(如果我应该在StackExchange上给他们两个不同的问题,请原谅/纠正我)。 一个简单的问题是,除了Haskell库中的代码之外,还有人意识到函数式编程和/或实现中的差异列表的学术考虑吗?jbapple的答案没有引用差异列表(逻辑编程中的差异列表存在于绝大部分内容中,并且存在于我在“周围某处”(TM)中提供的两个资源中)。在找到Haskell实现之前,我不知道这个想法已经从逻辑跃升为函数式编程。当然,Haskell差异列表是高阶函数的自然使用,其工作原理与逻辑编程中的完全不同,但是接口肯定是相似的。 我想问的更有趣(而且更模糊)的问题是上述Haskell差异列表库所要求的渐近上限看起来是否正确/合理。我的困惑可能是因为我失去了一些东西约显而易见约懒惰复杂的推理,但所主张的界限才有意义,我如果替换在大数据结构(或关闭阵型,或者变量查找,或东西)总是恒定的时间。还是“捕获”仅仅是因为“头”和“尾”的运行时间没有限制,正是因为这些操作可能必须经过任意一堆延迟的计算/替换才能完成?


2
二进制函数的连续传递变换
回想一下延续通过变换(CPS变换)这需要到β 甲:= - [R [R 阿(其中[R是固定的)和˚F :甲→ 乙至β ˚F :β 甲→ β 乙通过定义 β一种AAβA := R[R一种βA:=RRA\beta A \mathrel{{:}{=}} R^{R^A}[RRRF:A → Bf:A→Bf : A \to BβF:βA → β乙βf:βA→βB\beta f : \beta A \to \beta B 事实上我们有延续单子与单元 η 甲:甲→交通β 阿通过定义 η 甲 X := λ [R 。[RβFκ[R := κ (ř ∘ ˚F)。βfκr:=κ(r∘f).\beta …

1
是什么使一种语言(及其类型系统)能够证明有关其自身术语的定理?
我最近尝试实现Aaron的Cedille-Core,这是一种极简主义的编程语言,能够证明有关其术语的数学定理。我还证明了其上的λ编码数据类型的归纳法,这使他的扩展为什么必要的原因更加清楚。 几乎没有,我仍然想知道这些扩展来自何处。为什么他们是他们自己?什么使他们合理?我知道,例如,某些扩展(例如递归)破坏了该语言作为证明系统的地位。如果我决定也将CoC与其他原语一起扩展,我将如何辩解?我知道有必要进行标准化的证明,但这并不能证明这些原语“有意义”。 简而言之,什么使语言(及其类型系统)成为能够证明自己的术语定理的系统呢?

2
Alternative,MonadPlus(LeftCatch)和MonadPlus(LeftDistributive)之间有什么关系?
跟进什么是替代而不是MonadPlus的Monad示例?: 假设是单子。什么是关系betweem 米是一个另类,一个MonadPlusCatch和MonadPlusDistr?mmmmmm对于六种可能的组合中的每一种,我都希望有一个证据表明一个隐含着另一个,或者有一个反例却没有。 (我在用着 MonadPlusCatch用来区分满足Left-Catch规则的MonadPlus: mplus (return a) b = return a MonadPlusDistr区分MonadPlus是satifies 左分配规则: mplus a b &gt;&gt;= k = mplus (a &gt;&gt;= k) (b &gt;&gt;= k) 请参阅HaskellWiki上的MonadPlus。) 我目前的知识和直觉是: MonadPlusDist 替代 - 可能是正确的 - 似乎很简单,我相信我有一个证明的草图,我将对其进行检查,如果它是正确的,我会将其张贴在 AndrewC回答的这一部分。→→\rightarrow →→\rightarrow Maybe →→\rightarrow MaybeT (Either e)MaybeT m' ((pure x) &lt;|&gt; g) &lt;*&gt; a = …



3
可以使用具有数据并行运算符的全部功能语言来表示哪些算法?
想象一下一种函数式编程语言,其唯一的数据类型是数字标量和数组的任意嵌套。该语言缺乏任何无限迭代的方式,因此不允许以下内容: 显式循环(无论如何,没有副作用的使用很少) 递归 任意一等函数(无y组合器) 但是,该语言具有: 顶级功能 词法范围的let绑定 分支控制流程 常见的标量数学和逻辑函数 一些简单的数组构造函数,例如fill(n,x),它创建一个具有x相同值的n元素数组 最重要的是:执行并行结构化迭代(例如映射,归约,扫描,所有对)的一组受限的高阶运算符。 更具体地讲数据并行运算符: y = map(f,x)=&gt; y [i] = f [i] y = reduce(f,a,x)=&gt; y = f(a,f(y [p [0]],f(y [p [1 []],...)))) y = scan(f,a,x)=&gt; y [i] = reduce(f,a,y [0 ... i-1]) y = allpairs(f,x,y)=&gt; y [i,j] = f(x [i],y [j]) …

1
您如何使用交互组合器对Lamping的抽象算法进行编码?
以前,交互组合器已被建议作为λ微积分的编译目标。那篇论文实现了完整的λ演算。还已知有可能针对可进行 EAL类型化的λ项的子集优化λ演算的交互网络编码。该论文通过将EAL类型的λ项转换为交互网络来实现λ演算的子集,该交互网络可能比交互组合器更复杂,因为它们使用无限的标签字母来对复制器进行分组。 我想知道是否可以将这两个建议结合在一起。也就是说,作为交互组合器,抽象算法是否有任何编码-即可EAL类型的λ项?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.