- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读 Parallel and Concurrent Programming in Haskell 的第 11 章.在那本书中,以下 program用于同时获取 URL:
main = do
xs <- foldr conc (return []) (map getURL sites)
print (map B.length xs)
where
conc ioa ioas = do
(a,as) <- concurrently ioa ioas
return (a:as)
[g0, g1, g2]
.据我了解,
xs
将绑定(bind)到以下结构:
g0 `conc` (g1 `conc` (g2 `conc` (return [])))
thread0: g0 `conc` (g1 `conc` (g2 `conc` (return [])))
thread1: g0
thread2: (g1 `conc` (g2 `conc` (return [])))
thread3: g1
thread4: (g2 `conc` (return []))
thread5: g2
thread6: return []
最佳答案
所有的猜测都是错误的!其实有六 线程产生。
让我们拿出大锤——
import Control.Concurrent.Async
import Control.Concurrent (myThreadId)
import qualified Data.ByteString as B
-----------------------------------------------------------------------------
sites = ["http://www.google.com",
"http://www.wikipedia.com/wiki/Spade",
"http://www.wikipedia.com/wiki/Shovel"]
getURL _ = return B.empty
annotate :: IO a -> IO a
annotate action = do
tid <- myThreadId
putStrLn $ "I'm a thread and my ID is: " ++ show tid
action
-- <<main
main = do
xs <- foldr conc (return []) (map getURL sites)
print (map B.length xs)
where
conc ioa ioas = do
(a,as) <- concurrently (annotate ioa) (annotate ioas)
return (a:as)
-- >>
concurrently
的所有操作将用
annotate
包裹,这会导致线程吐出它的
ThreadId
到标准输出。运行这个我得到-
+$ ./geturls9
I'm a thread and my ID is: ThreadId 5
I'm a thread and my ID is: ThreadId 6
I'm a thread and my ID is: ThreadId 8
I'm a thread and my ID is: ThreadId 9
I'm a thread and my ID is: ThreadId 10
I'm a thread and my ID is: ThreadId 7
[0,0,0]
g0 `conc` (g1 `conc` (g2 `conc` (return [])))
本身没有传递给
concurrently
,所以你的
thread0
当然只是主线程,而不是由异步库创建的。
mapConcurrently
用于并发处理任何
Traversable
所以您不必使用
foldr
构建自己的.为什么在 Haskell 的并行和并发编程中没有提到这个函数,我不确定。它是在 async-2.0.1.0 中引入的,Haskell 平台版本 2012.4.0.0(PCPH 的介绍中提到所有代码都经过测试)包括 async-2.0.1.3。可能是教学原因,可能是通常的发布延迟以及针对旧版本的平台/库开发的代码,谁知道呢。同一介绍提到“示例代码将随着平台新版本的发布而更新。”如果您感觉强烈,请提交
erratum !
关于multithreading - 这个程序产生了多少线程(geturls9.hs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38812494/
阅读Yesod的源代码中,我遇到过带有“.hsfiles”扩展名的文件。示例:mongo.hsfiles 。它们是什么,为什么创建它们以及为什么使用它们? 最佳答案 您可以看到here相关代码: ba
我在关注 stack guide我得到了一个新的项目设置(耶!)。 它生成了以下文件布局: . ├── app │ ├── Main.hs ├── .gitignore ├── LICENSE ├
我在我的项目中创建了一个类(javahelp),用于在单击帮助内容(菜单项)时获取java帮助文件。我更新了目录中安装的 javahelp-2.0_05 C:\Program Files\javahe
我有一个巨大的 haskell 文件,可以毫无问题地编译和运行。我想将一些函数和类型定义放在通用 hs 文件中的单独模块中,然后将其导入我的主模块中。虽然主程序编译没有任何错误(它也编译导入的模块),
我正在阅读 Parallel and Concurrent Programming in Haskell 的第 11 章.在那本书中,以下 program用于同时获取 URL: main = do
我一直在尝试在我的 Haskell 项目中使用glpk-hs,但我完全不知道如何去做。我正在使用 stack 来运行我的程序,我的困惑很可能来自于我对其工作原理缺乏了解。 话虽这么说,我已经下载了gl
我遵循此处的指示: https://haskell.fpcomplete.com/tutorial/stack-script 我有一个具有以下文件结构的 cabal/stack 项目: app/Mai
我在基于 arch 的系统之上使用 xmonad。但是升级后我无法通过编译我的 xmonad.hs 文件 $ xmonad --recompile 我似乎在 xmonad 的每个模块上都出错,甚至 i
encoding包使用 HaXml在其构建脚本中(在 Setup.hs 中)。它碰巧使用了在 HaXml-1.19 和 HaXml-1.22 之间更改的接口(interface)位。如果编码包能够使用
我正在使用 Notepad++ 和 WinGHCi 做一些功课,我必须定义一个小“数据库”。格式是任意的,我认为这不是我要去的地方。无论如何,这是我在 *.hs 文件中使用的内容: let stude
我的项目结构如下: ~/.../project_name project_name.cabal Setup.hs src/ Main.hs Data/ ... test
我需要找出在 Setup.hs 中构建的标志(在 cabal 文件中找到的类型)。我想我正在寻找类型为 FlagAssignment 的东西。我怎样才能得到这个? 最佳答案 idris 必须这样做,y
我将 stack.exe v0.1.2.2 放入我的 PATH 目录之一,然后通过 stack setup 安装 ghc-7.8.4。 我尝试安装 ghc-mod 并获得奇怪的错误 Setup.hs:
我正在尝试比较两个不同的目录,其中有很多目录 du -hs User/data/dbs/* home/common/dbs/* 结果是两个目录依次显示出来。 12gb User/data/dbs/fi
我得到了一个 Setup.hs 文件,以及另一个包含源代码的 .hs 文件。每当我尝试通过以下方式配置安装时: runhaskell Setup.hs configure 我得到错误: Setup:
我制作了一个名为time.hs的文件。它包含一个测量另一个函数执行时间的函数。 有没有办法将time.hs文件导入到另一个Haskell脚本中? 我想要这样的东西: module Main where
我试图从 ~/.xmonad/Tree.hs 导入一个名为“Tree.hs”的自定义本地模块,但我得到: Error detected while loading xmonad configurati
组合在 Haskell 中是很正常的,但我只知道我可以定义组合函数的特殊行为,说 Prelude> (floor . sqrt) (10^55) 316227766016837936511293849
我目前正在完成我的第一个 Haskell 项目,在工作的最后一步,在连接不同的 Haskell 文件后,我的 I/O 函数似乎表现得很奇怪。 我有一个主文件(f1.hs),它加载多媒体库的一些信息并将
我正在使用山狮。我打开终端,然后加载 ghci , 我写 :l然后我尝试通过用鼠标将文件从我的桌面拖动到终端来加载我的文件(在我的桌面上),所以我知道位置是正确的,我明白了,提前谢谢你: Prelud
我是一名优秀的程序员,十分优秀!