gpt4 book ai didi

scala - 思考 Elm 中所见模式的名称以及是否有其他类似情况

转载 作者:行者123 更新时间:2023-12-04 16:38:24 28 4
gpt4 key购买 nike

我目前是FP的学生。当我查看不同函数式语言提供的不同语法时,我在 Elm 示例代码中遇到了一个模式。我对此很好奇。

这是示例代码

myList = [{foo = "bar1"},{foo = "bar2"}]    
foos = myList |> List.map .foo

在这里的最后一行, List.map正在通过 .foo .我相信这种风格被称为无点,但是将属性传递给 List.map 的特定模式如何?功能?

这是更常见的事情吗?可以在 Haskell 中做到这一点吗? F#?斯卡拉?谢谢你的帮助。

此处模式的(或是否有)正式(或非正式?)名称是什么?对象的属性用作接受对象并在其上调用所述属性的函数的简写?

最佳答案

如果您将列表视为“数据集”或“表”,并将列表中的每个元素视为“行”,并将元素的数据类型定义为“属性”的枚举,那么您get 是关系代数意义上的一种“投影”:https://en.wikipedia.org/wiki/Projection_(relational_algebra) .

这是一个 Scala 示例,感觉有点像 SQL:

case class Row(id: Int, name: String, surname: String, age: Int)

val data = List(
Row(0, "Bob", "Smith", 25),
Row(1, "Charles", "Miller", 35),
Row(2, "Drew", "Shephard", 45),
Row(3, "Evan", "Bishop", 55)
)

val surnames = data map (_.surname)
val ages = data map (_.age)
val selectIdName = data map { row => (row.id, row.name) }

println(surnames)
// List(Smith, Miller, Shephard, Bishop)

println(selectIdName)
// List((0,Bob), (1,Charles), (2,Drew), (3,Evan))

在这里, _.fieldName是类型为 Row => TypeOfTheField 的内联函数文字的简短语法.

在 Haskell 中,这有点微不足道,因为记录数据类型的声明会自动将所有 getter 函数带入作用域:
data Row = Row { id :: Int
, name :: String
, surname :: String
, age :: Int
} deriving Show

main = let dataset = [ Row 0 "Bob" "Smith" 25
, Row 1 "Charles" "Miller" 35
, Row 2 "Drew" "Shephard" 45
, Row 3 "Evan" "Bishop" 55
]
in print $ map name dataset
-- prints ["Bob","Charles","Drew","Evan"]

从版本 8 开始,甚至 Java 也有类似的东西:
import java.util.*;
import java.util.stream.*;
import static java.util.stream.Collectors.*;

class JavaProjectionExample {
private static class Row {
private final int id;
private final String name;
private final String surname;
private final int age;
public Row(int id, String name, String surname, int age) {
super();
this.id = id;
this.name = name;
this.surname = surname;
this.age = age;
}
public int getId() {
return this.id;
}
public String getName() {
return this.name;
}
public String getSurname() {
return this.surname;
}
public int getAge() {
return this.age;
}
}

public static void main(String[] args) {
List<Row> data = Arrays.asList(
new Row(0, "Bob", "Smith", 25),
new Row(1, "Charles", "Miller", 35),
new Row(2, "Drew", "Shephard", 45),
new Row(3, "Evan", "Bishop", 55)
);

List<Integer> ids = data.stream().map(Row::getId).collect(toList());
List<String> names = data.stream().map(Row::getName).collect(toList());

System.out.println(ids);
System.out.println(names);
}
}

在这里, Row::getterName是 getter 方法的特殊语法,它是类型 Function<Row, FieldType> 的值.

关于scala - 思考 Elm 中所见模式的名称以及是否有其他类似情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48510844/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com