我想实现以下目标:
- 有一个我需要处理的字符串列表。
- 这些处理器有几种不同的类型,每一种都知道要读取字符串的哪一部分。
- 我需要分两个阶段工作:首先,处理器需要查看每个输入字符串以构建特定于处理器的数据;其次,每个输入字符串由每个处理器处理,并将生成的字符串合并为一个。
以可变的方式很容易做到:所有处理器都有一个通用的基类,它们聚合的不同类型的数据被封装在具体的实现中;该界面仅包含 2 个功能——“查看输入字符串并构建内部数据”和“使用您的内部数据处理输入字符串”。
当我在 Scala 中编写它时,我想知道是否存在纯函数方法。问题是现在这些处理器的基本特征是由它们的内部数据类型参数化的,而且似乎没有办法列出不同类型的处理器。
这个问题可以用一个更简单的例子来证明:假设我坚持使用可变方法,但由于某种原因已经参数化了处理器从字符串中获取的类型:
trait F[V] {
def get(line: String) : V
def aggregate(value: V)
def process(value: V) : String
}
class F1 extends F[Int] // ...
class F2 extends F[HashMap[Int, Int]] // ...
for (s <- List("string1", "string2");
f <- List(new F1(), new F2())
{
f.aggregate(f.get(s)); // Whoops --- doesn't work
}
它不起作用,因为f.get(s)
返回Any
。看起来我需要在 Scala 的类型系统中表达,List(new F1(), new F2())
其中包含F[?]
不同但一致的内容,因为如果我采用该列表的一个元素,它的类型参数有一些具体值,并且f.get(s)
属于那种类型,应该被f.aggregate()
.
最后,我想要这样的东西(有遗漏,因为我不知道该怎么做):
trait F[D] {
def initData : D
def aggregate(line: String, data: D) : D
def process(line: String, data: D) : String
}
class F1 extends F[Int] // ...
class F2 extends F[HashMap[Int, Int]] // ...
// Phase 1
// datas --- List of f.initData, how to?
for (s <- List("string1", "string2")) {
for (f <- List(new F1(), new F2()) {
// let fdata be f's data
// update fdata with f.aggregate(s, fdata)
}
}
// Phase 2
for (s <- List("string1", "string2")) {
for (f <- List(new F1(), new F2()) {
// let fdata be f's data
// for all fs, concatenate f.process(s, fdata) into an output string
}
}
问题:
- 这个任务可以在 Scala 中以纯函数方式解决吗?
- 这个任务可以用其他函数式语言解决吗?
- 这种情况看起来很一般。有它的名字我可以搜索吗?
- 假设几乎没有类型理论和函数式编程语言的背景,最好的阅读地点在哪里?