我正在尝试创建一个简单的示例来进行并行评估:
import Control.Parallel.Strategies
main = do
runEval $ do
a <- rpar (\x -> x + 5)
b <- rseq (\x -> x + 15)
return (a, b)
它说:
Couldn't match expected type `IO t0'
with actual type `(Integer -> Integer, Integer -> Integer)'
我知道这与Haskell中的并行无关,但不管怎样,我该如何在Haskell中构建这样一个简单的例子呢?
$
被称为应用运算符,它的存在主要是为了消除括号。f $ x
与f (x)
等价,而g $ f $ x
等价于g (f (x))
。它的右侧所有内容都会被括号包裹起来,并传递给左侧的表达式。 - bheklilrdo
块不能在任何表达式上下文中使用 - 只能作为表达式中的第一件事。但是,所有二元运算符都将它们的每个参数视为完整的表达式,因此您可以将一个do
块放在其右侧。 - Carldo { a <- rpar $ (+5) 4; b <- rseq $ (+15) 4; return (a, b); }
在$
与runEval
之间被传递为单一的参数。没有$
,编译器会把它看做是do {print $ runEval do; ... }
,其中do
是runEval
的唯一参数。如果你定义了一个等价于内部do
块的独立函数:f = do { a <- rpar $ (+5) 4; b <- rseq $ (+15) 4; return (a, b); }
,那么main
可以简单地写成print $ runEval f
。 - bheklilr