我试图解决这个问题的练习:
编写一个程序,使用并行计算计算文本中字母的频率.
基本上,我有一个FreqMap类型:
type FreqMap map[rune]int
Run Code Online (Sandbox Code Playgroud)
和一个Frequency功能:
func Frequency(s string) FreqMap {
m := make(FreqMap)
for _, v := range s {
m[v]++
}
return m
}
Run Code Online (Sandbox Code Playgroud)
Exercism提供了一个使用递归实现并发版本的示例,但我想使用for 循环实现我自己的版本.我提出了以下解决方案,但不起作用:
func ConcurrentFrequency(l []string) FreqMap {
c := make(chan FreqMap)
for i := 0; i < len(l); i++ {
go func(i int) {
c <- Frequency(l[i])
}(i)
}
return <- c
}
Run Code Online (Sandbox Code Playgroud)
这似乎只在1次迭代后返回,c似乎只包含1个goroutine的结果; 如果我添加一个,我会得到相同的结果sync.WaitGroup.
你能解释一下我在这里缺少什么吗?
预先感谢您的帮助!
这是类型签名和filter函数的定义,从了解你是一个很好的Haskell!:
filter' :: (a -> Bool) -> [a] -> [a]
filter' _ [] = []
filter' p (x:xs)
| p x = x : filter' p xs
| otherwise = filter' p xs
Run Code Online (Sandbox Code Playgroud)
书中的用法示例elem如下:
filter' (`elem` ['a'..'z']) "Hell0!"
Run Code Online (Sandbox Code Playgroud)
哪个回报:
"ell"
Run Code Online (Sandbox Code Playgroud)
在这个特定的例子中,是否有可能使用elem前缀函数而不是中缀函数作为谓词?
在更一般的意义上,是否有一种方法只提供第二个参数以部分应用前缀函数?
在此先感谢您的帮助!