javascript

java

python

c#

android

c++

node.js

php

html

jquery

ios

reactjs

css

.net

git

ruby-on-rails

sql

c

ruby

string

函数式编程 - 这个改组算法有什么问题,如何解决?我怎么知道?

就像背景一样,我知道Fisher-Yates完美的洗牌。 它的O(n)复杂性和保证的一致性是一个很好的混乱,我不会使用它...在一个允许就地更新数组的环境中(所以在大多数情况下,如果不是全部, 命令式编程环境)。

可悲的是,函数式编程世界并没有让你访问可变状态。

然而,由于Fisher-Yates,我没有很多关于如何设计改组算法的文献。 完全解决这个问题的几个地方之前做了这么简单的说法,实际上,“所以这里是Fisher-Yates,这是你需要知道的所有洗牌”。 最后,我必须提出自己的解决方案。

我想出的解决方案是这样的,可以随机播放任何数据列表:

  • 如果列表为空,则返回空集。
  • 如果列表包含单个项目,则返回该单个项目。
  • 如果列表非空,则使用随机数生成器对列表进行分区,并将算法递归地应用于每个分区,然后汇总结果。

在Erlang代码中,它看起来像这样:

shuffle([])  -> [];
shuffle([L]) -> [L];
shuffle(L)   ->
  {Left, Right} = lists:partition(fun(_) -> 
                                    random:uniform() < 0.5 
                                  end, L),
  shuffle(Left) ++ shuffle(Right).

(如果这看起来像是一种疯狂的快速排序,那么,基本上就是这就是它。)

所以这就是我的问题:同样的情况使得找到非Fisher-Yates的改组算法变得困难,这使得找到分析混洗算法的工具同样困难。 在分析PRNG的均匀性,周期性等方面,我可以找到很多文献,但没有关于如何分析洗牌的大量信息。 (事实上,我在分析洗牌时发现的一些信息是完全错误的 - 很容易通过简单的技术欺骗。)

所以我的问题是这样的:我如何分析我的改组算法(假设random:uniform()调用那里是否有生成具有良好特征的适当随机数的任务)? 我可以使用哪些数学工具来判断,在1 ... 100的整数列表中,是否有100,000次洗牌运行给了我合理的改组结果? 我已经做了一些我自己的测试(例如,比较增量到shuffles中的减量),但我想知道更多。

如果对该混洗算法本身有任何了解,也会受到重视。

trans by 2019-05-12T12:52:15Z

函数式编程 - “Monad变换器比效果更强大” - 例子?

Edwin C. Brady撰写的关于Idris影响的“使用代数效应和依赖类型进行编程和推理”的论文包含(未引用的)声明:

尽管[效果和单子变换器]在功率上并不相同 - monad和monad变换器可以表达更多概念 - 但是捕获了许多常见的有效计算。

哪些例子可以通过monad变换器建模而不是效果?

trans by 2019-05-09T13:31:40Z

斯卡拉 - 早期中止

什么是提前终止折扣的最佳方式? 作为一个简化的例子,想象一下我想总结Iterable中的数字,但如果我遇到一些我不期望的东西(比如一个奇数)我可能想要终止。 这是第一个近似值

def sumEvenNumbers(nums: Iterable[Int]): Option[Int] = {
  nums.foldLeft (Some(0): Option[Int]) {
    case (Some(s), n) if n % 2 == 0 => Some(s + n)
    case _ => None
  }
}

然而,这个解决方案非常难看(如果我做了.foreach和返回 - 它会更清晰和更清晰),最糟糕的是,即使遇到非偶数,它也会遍历整个iterable。

那么编写像这样的折叠最好的方法是什么呢? 我应该去递归地写这个,还是有一个更被接受的方式?

trans by 2019-05-09T07:43:38Z

javascript - 如何避免Node.js中异步函数的长嵌套

我想创建一个显示来自数据库的一些数据的页面,所以我创建了一些从我的数据库中获取数据的函数。 我只是Node.js中的新手,所以据我所知,如果我想在一个页面中使用所有这些(HTTP响应),我必须将它们全部嵌套:

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  var html = "<h1>Demo page</h1>";
  getSomeDate(client, function(someData) {
    html += "<p>"+ someData +"</p>";
    getSomeOtherDate(client, function(someOtherData) {
      html += "<p>"+ someOtherData +"</p>";
      getMoreData(client, function(moreData) {
        html += "<p>"+ moreData +"</p>";
        res.write(html);
        res.end();
      });
    });
  });

如果有很多这样的函数,那么嵌套就成了问题。

有办法避免这种情况吗? 我想这与你如何组合多个异步函数有关,这似乎是一个基本的东西。

trans by 2019-04-29T15:47:58Z

为什么我可以在C ++中定义函数内的结构和类?

我只是在C ++中错误地做了类似的事情,并且它有效。 我为什么要这样做?

int main(int argc, char** argv) {
    struct MyStruct
    {
      int somevalue;
    };

    MyStruct s;
    s.somevalue = 5;
}

在做完这个之后,我记得很久以前在某个地方读过这个技巧,作为一种穷人用于C ++的函数式编程工具,但我不记得为什么这个有效,或者我读到它。

欢迎回答任何一个问题!

注意:虽然在写这个问题时我没有得到任何关于这个问题的引用,但是当前的侧边栏指出了它,所以我会把它放在这里供参考,无论哪种方式问题都不同但可能有用。

trans by 2019-04-29T00:23:49Z

lambda - Java SE 8是否有Pairs或Tuples?

我正在玩Java SE 8中的延迟功能操作,我希望[0, 0, 0]索引false到一对/元组[0, 2, 4],然后基于第二个value[i]元素filter,最后输出只是索引。

我仍然必须忍受这个:C ++ Pair&lt; L,R&gt;的等价物是什么? 在Java? 在lambdas和溪流的大胆新时代?

更新:我提供了一个相当简化的示例,其中有一个由@dkatzel提供的简洁解决方案,其中一个答案如下。 但是,它没有概括。 因此,让我添加一个更一般的例子:

package com.example.test;

import java.util.ArrayList;
import java.util.stream.IntStream;

public class Main {

  public static void main(String[] args) {
    boolean [][] directed_acyclic_graph = new boolean[][]{
        {false,  true, false,  true, false,  true},
        {false, false, false,  true, false,  true},
        {false, false, false,  true, false,  true},
        {false, false, false, false, false,  true},
        {false, false, false, false, false,  true},
        {false, false, false, false, false, false}
    };

    System.out.println(
        IntStream.range(0, directed_acyclic_graph.length)
        .parallel()
        .mapToLong(i -> IntStream.range(0, directed_acyclic_graph[i].length)
            .filter(j -> directed_acyclic_graph[j][i])
            .count()
        )
        .filter(n -> n == 0)
        .collect(() -> new ArrayList<Long>(), (c, e) -> c.add(e), (c1, c2) -> c1.addAll(c2))
    );
  }

}

这给出了错误输出[0, 0, 0],它对应于三列全部为false的计数。我需要的是这三列的索引。 正确的输出应该是[0, 2, 4].我怎样才能得到这个结果?

trans by 2019-04-28T11:10:29Z

haskell - Mathematica:什么是符号编程?

我是斯蒂芬·沃尔夫勒姆(Stephen Wolfram)的忠实粉丝,但他绝对不会羞于吹响自己的号角。 在许多参考文献中,他将Mathematica称为不同的符号编程范例。 我不是Mathematica用户。

我的问题是:这个符号编程是什么? 它与函数式语言(如Haskell)相比如何?

trans by 2019-04-26T01:44:55Z

何时使用函数式编程语言?

在哪种情况下,我应该选择使用函数式编程语言而不是更简洁的面向对象语言,如C ++,C#或Java?

我理解什么是函数式编程,我真正理解的是什么类型的问题是一个完美的解决方案?

trans by 2019-04-24T20:25:34Z

haskell - 傻瓜的递归计划?

我正在寻找一些非常简单,易于掌握的递归方案和核心运动方案(catamorphisms,anorporphisms,hylomorphisms等)的解释,这些解释不需要跟随大量的链接,或者打开类别理论教科书。 我确信我已经无意识地重新设计了许多这些方案,并在编码过程中将它们“应用”在我的头脑中(我相信我们很多人都有),但我不知道(共同)递归方案我是什么 使用被称为。 (好吧,我撒了谎。我刚刚读了一些这些,这引发了这个问题。但在今天之前,我一无所知。)

我认为这些概念在编程社区中的传播受到了令人生畏的解释和例子的阻碍 - 例如在维基百科上,而且在其他地方。

它们的名字也可能受到阻碍。 我认为有一些替代的,较少的数学名称(关于香蕉和带刺铁丝网的东西?)但是我不知道我使用的递归方案的名称是什么。

我认为使用表示简单实际问题的数据类型的示例,而不是抽象数据类型(如二叉树)会有所帮助。

trans by 2019-04-15T23:58:01Z

haskell - 类型MonadPlus,Alternative和Monoid之间的区别?

标准库Haskell类型类Alternative,somemany各自提供两种具有基本相同语义的方法:

  • 空值:Alternative,somemany
  • 运算符Alternative,它将类型类中的值连接在一起:some,manymappend

所有这三个都规定了应遵守的法律:

mempty `mappend` x = x
x `mappend` mempty = x

因此,似乎三个类型都提供相同的方法。

Alternative也提供了somemany,但它们的默认定义通常是足够的,所以它们在这个问题上并不太重要。)

所以,我的疑问是:为什么这三个极为相似的类? 除了不同的超类限制之外,它们之间是否有任何真正的区别?

trans by 2019-04-15T13:41:00Z

函数式编程 - Scala赋值评估单元而非分配值的动机是什么?

Scala分配评估单元而不是分配的值的动机是什么?

I / O编程中的一个常见模式是执行以下操作:

while ((bytesRead = in.read(buffer)) != -1) { ...

但这在Scala中是不可能的,因为......

bytesRead = in.read(buffer)

..返回Unit,而不是bytesRead的新值。

从函数式语言中省略,似乎是一件有趣的事情。我想知道为什么这样做了?

trans by 2019-04-12T08:40:06Z

函数式编程 - Java是否支持Currying?

我想知道是否有任何方法可以在Java中提取它。 我认为没有原生支持闭包是不可能的。

trans by 2019-04-11T02:26:06Z

函数式编程 - foldLeft和reduceLeft之间的区别

我已经了解了foldLeftreduceLeft之间的基本区别

foldLeft:

  • 初始值必须通过

reduceLeft:

  • 将集合的第一个元素作为初始值
  • 如果集合为空,则抛出异常

还有其他区别吗?

有两种方法具有相似功能的任何特定原因?

trans by 2019-03-28T22:34:19Z

c# - 一个字符串的字符串列表

让我们说你有一个:

List<string> los = new List<string>();

在这个疯狂的功能世界中,我们生活在这些日子里,其中一个最适合通过连接这些来创建一个字符串:

String.Join(String.Empty, los.ToArray());

StringBuilder builder = new StringBuilder();
los.ForEach(s => builder.Append(s));

string disp = los.Aggregate<string>((a, b) => a + b);

或简单的旧StringBuilder foreach

或者,还有更好的方法?

trans by 2019-03-22T21:56:31Z

Java 8的Optional.ifPresent和if-not-Present的功能风格?

在Java 8中,我想对Optional对象(如果它存在)执行某些操作,如果不存在则执行另一项操作。

if (opt.isPresent()) {
  System.out.println("found");
} else {
  System.out.println("Not found");
}

但这不是一种“功能风格”。

opt有一个obj方法,但我无法链接return null方法。

因此,我不能写:

opt.ifPresent( x -> System.out.println("found " + x))
   .orElse( System.out.println("NOT FOUND"));

在回复@assylias时,我认为opt不适用于以下情况:

opt.map( o -> {
  System.out.println("while opt is present...");
  o.setProperty(xxx);
  dao.update(o);
  return null;
}).orElseGet( () -> {
  System.out.println("create new obj");
  dao.save(new obj);
  return null;
});

在这种情况下,当存在opt时,我更新其属性并保存到数据库。 当它不可用时,我创建一个新的obj并保存到数据库。

注意在两个lambdas我必须返回opt

但是当存在opt时,两个lambdas都将被执行。 将更新obj,并将新对象保存到数据库。 这是因为第一个lambda中的return null。 并且orElseGet()将继续执行。

trans by 2019-03-22T05:46:48Z

为什么还没有接受函数式编程呢?

我已经阅读了一些关于声明/函数编程(语言)的文章,尝试过Haskell以及自己编写的文本。 从我所看到的,函数式编程比传统的命令式风格有几个优点:

  • 无国籍计划; 无副作用
  • 并发; 采用不断增长的多核技术,发挥得非常好
  • 程序通常较短,在某些情况下更容易阅读
  • 生产力提高(例如:Erlang)

  • 命令式编程是一个非常古老的范例(据我所知),可能不适合21世纪

为什么使用功能语言的公司或程序仍然如此“罕见”?

为什么在查看函数式编程的优点时,我们仍在使用命令式编程语言?

也许它在1990年还为时尚早,但今天呢?

trans by 2019-03-14T01:24:35Z

clojure - 是否有用于函数式编程的软件工程方法?

今天教授的软件工程完全专注于面向对象的编程和面向世界的“自然”面向对象的视图。 有一个详细的方法描述了如何将域模型转换为具有多个步骤的类模型以及许多(UML)工件,如用例图或类图。 许多程序员已经内化了这种方法,并且很好地了解了如何从头开始设计面向对象的应用程序。

新的炒作是函数式编程,在许多书籍和教程中都有教授。 但功能软件工程呢?在阅读有关Lisp和Clojure的文章时,我发现了两个有趣的陈述:

  1. 功能程序通常是自下而上而不是自上而下开发('On Lisp',Paul Graham)

  2. 函数程序员使用映射,其中OO程序员使用对象/类('Clojure for Java Programmers',Rich Hickley的演讲)。

那么功能性应用程序的系统化(基于模型的?)设计的方法是什么,即在Lisp或Clojure中? 有哪些常见步骤,我使用哪些工件,如何将它们从问题空间映射到解决方案空间?

trans by 2019-03-10T00:05:06Z

术语表 - 过程式编程和函数式编程有什么区别?

我已经阅读过程序编程和函数式编程的维基百科文章,但我仍然有点困惑。 有人可以把它归结为核心吗?

trans by 2019-03-09T10:34:29Z

ocaml - 在函数式编程中,什么是函子?

在阅读有关函数式编程的各种文章时,我偶然遇到过“Functor”这个术语,但作者通常认为读者已经理解了这个术语。 在网上浏览提供了过多的技术描述(参见维基百科文章)或令人难以置信的模糊描述(请参阅本ocaml教程网站上的Functors部分)。

有人可以友好地定义术语,解释它的用法,并提供一个如何创建和使用Functors的例子吗?

编辑:虽然我对这个术语背后的理论感兴趣,但我对这个理论的兴趣不如我在实现和实际使用这个概念。

编辑2:看起来有一些交叉的术语:我特别指的是函数式编程的函数,而不是C ++的函数对象。

trans by 2019-03-07T20:19:06Z

函数式编程 - 没有nu的语言的最佳解释

当程序员抱怨空错误/异常时,有人经常会问我们做什么而没有null。

我对选项类型的酷感有一些基本的想法,但我没有最好的表达它的知识或语言技巧。 对于普通程序员可以接近的方式写的以下内容有什么好的解释,我们可以指出那个人?

  • 默认情况下,引用/指针的不可取性是可以为空的
  • 选项类型的工作原理包括简化检查空案例的策略
    • 模式匹配和
    • monadic理解
  • 替代解决方案,如消息吃零
  • (我错过了其他方面)
trans by 2019-03-07T15:44:13Z

上一页 1 2 3 4 5 6 7 8 9 10 11 12 下一页 共12页