标签: declarative-programming

如何在Scala中声明性地创建列表?

在C#中,我可以声明性地声明一个列表,换句话说,声明它的结构并在下面同时初始化它:

var users = new List<User>
            {
                new User {Name = "tom", Age = 12}, 
                new User {Name = "bill", Age = 23}
            };
Run Code Online (Sandbox Code Playgroud)

忽略.Net中的List和Scala中的List之间的差异(即,随意使用不同的集合类型),是否可以在Scala 2.8中执行类似的操作?

UPDATE

从下面调整Thomas的代码我相信这是与所示C#代码最接近的代码:

class User(var name: String = "", var age: Int = 0)

val users = List(
  new User(name = "tom", age = 12), 
  new User(name = "bill", age = 23))
Run Code Online (Sandbox Code Playgroud)

collections scala declarative-programming

4
推荐指数
1
解决办法
1311
查看次数

这种声明式I/O方法有什么问题

我不确定这与"程序语言设计"相反的"编程"究竟有多少.但问题是:

说,为了简单起见,我们有两个'特殊'列表/数组/向量/为了简单我们只称为'端口',一个叫做stdIn另一个stdOut.这些概念上分别代表

  • 在程序持续时间内给予程序的所有用户输入
  • 在程序持续期间写入终端的所有输出

在Haskell启发的伪代码中,应该可以创建这个完全声明性的程序:

 let stdOut =   ["please input a number", 
                "and please input another number", 
                "The product of both numbers is: " ++ stdIn[0] * stdIn[1]]
Run Code Online (Sandbox Code Playgroud)

哪个会做到预期,要求两个数字,并打印他们的产品.诀窍是stdOut表示在程序完成时写入终端的字符串列表,stdIn是输入字符串列表.键入错误以及需要一些安全措施才能在输入新行后仅打印下一行这一事实为了简单起见而留在这里,它可能很容易解决.

所以,在我实施这个想法之前,我忽略了它有什么陷阱吗?我不知道已经存在类似的结构,所以不考虑我忽略了一个明显的陷阱是天真的.

否则,我当然知道:

 let stdOut =   [stdIn[50],"Hello, World!"]
Run Code Online (Sandbox Code Playgroud)

如果这些结果需要以与上述类似的方式交织,那将是一个错误.

functional-programming side-effects logic-programming declarative-programming

2
推荐指数
2
解决办法
403
查看次数

在单循环中以声明方式单独按多个字段进行 Java 流分组

我用谷歌搜索了它,但我主要找到了按聚合字段分组或更改流响应的案例,但不是以下场景:

我有一个User带有字段categorymarketingChannel.

我必须以声明式风格编写一个方法,该方法接受用户列表并基于category和基于marketingChannel单独(即 not groupingBy(... ,groupingBy(..)))计算用户 。

我无法在一个循环中完成。这是我必须达到的目标。

我编码了一些方法如下:

import java.util.*;
import java.util.stream.*;
public class Main
{
    public static void main(String[] args) {
        List<User> users = User.createDemoList();
        imperative(users);
        declerativeMultipleLoop(users);
        declerativeMultipleColumn(users);
    }
    
    public static void imperative(List<User> users){
        Map<String, Integer> categoryMap = new HashMap<>();
        Map<String, Integer> channelMap = new HashMap<>();
        for(User user : users){
           Integer  value = categoryMap.getOrDefault(user.getCategory(), 0);
           categoryMap.put(user.getCategory(), value+1);
           value = channelMap.getOrDefault(user.getMarketingChannel(), 0);
           channelMap.put(user.getMarketingChannel(), value+1);
        }
        System.out.println("imperative");
        System.out.println(categoryMap);
        System.out.println(channelMap); …
Run Code Online (Sandbox Code Playgroud)

java declarative-programming java-stream groupingby

2
推荐指数
1
解决办法
69
查看次数

如何求和两个二维数组的元素?

我正在尝试使用 java 流 API 将两个二维数组的元素相互添加。
我用一维数组解决了这个问题,但我不知道如何进一步处理二维数组。

这是要转换的代码:

public static int[][] add(final int[][] m1, final int[][] m2) {
    int[][] e = new int[m2.length][m2[0].length];
    for (int i = 0; i < m1.length; i++) {
        for (int j = 0; j < m1[i].length; j++) {
            e[i][j] = m1[i][j] + m2[i][j];
        }
    }
    return e;
}
Run Code Online (Sandbox Code Playgroud)

这是我为相同目的编写的代码,但仅使用一维数组

public static int[] addOneDimension(final int[] a, final int b[]) {
    int[] c = IntStream.range(0, a.length)
            .map(i -> a[i] + b[i])
            .toArray(); …
Run Code Online (Sandbox Code Playgroud)

java arrays lambda declarative-programming java-stream

1
推荐指数
1
解决办法
110
查看次数

-1
推荐指数
3
解决办法
9593
查看次数

陈述语言

我正在阅读一篇关于声明性编程语言的文章.

如果我不理解这种类型/范式的编程语言的质量,并且它与命令式语言形成鲜明对比,那么我是否应该阅读这种类型的编程语言(如Haskell)中的编程,然后再阅读该文章?

haskell imperative-languages imperative-programming declarative-programming

-4
推荐指数
1
解决办法
1839
查看次数