假设:
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
?
答案 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)
对来自的地方。