从Haskell中的并行和并发编程中查看`evalPair`

时间:2016-07-09 18:28:38

标签: haskell

假设:

import Control.Parallel
import Control.Parallel.Strategies

evalPair :: Strategy a -> Strategy b -> Strategy (a, b)
evalPair sa sb (a, b) = do
   a' <- sa a
   b' <- sb b
   return (a', b')

来自Parallel and Concurrent Programming in Haskell

我不明白(a, b)来自何处,即evalPair的第三个参数。

在没有Strategy类型别名的情况下重写函数:

*Main> :i Strategy
type Strategy a = a -> Eval a
        -- Defined in `Control.Parallel.Strategies'

它是:

evalPair' :: (a -> Eval a) -> (b -> Eval b) -> Strategy (a, b)
evalPair' sa sb (a, b) = do
   a' <- sa a
   b' <- sb b
   return (a', b')

但是,我仍然不理解(a, b)论点。为什么evalPair类型签名不显示:Strategy a -> Strategy b -> (a, b) -> Strategy b

1 个答案:

答案 0 :(得分:3)

请注意,Strategy (a,b)(a,b) -> Eval (a,b)类型的函数。

另一种为evalPair'编写签名的方法是:

evalPair' :: (a -> Eval a) -> (b -> Eval b) -> ( (a,b) -> Eval (a,b) )

由于函数应用程序关联到右侧,我们可以删除最后一对parens。如果我们匹配参数,我们有:

evalPair' :: (a -> Eval a) -> (b -> Eval b) -> (a,b) -> Eval (a,b)
evalPair'      sa                sb            (a,b) = do
  ...
  return (a', b')

这就是(a,b)对来自的地方。