在http://www.haskell.org/haskellwiki/Pointfree#Tool_support页面,介绍了(
->) a
单子。什么是这个单子?使用符号使得搜索变得困难。->) a
单子。什么是这个单子?使用符号使得搜索变得困难。type Reader r = (->) r -- Reader r a == (->) r a == r -> a
instance Monad (Reader r) where
return a = const a
m >>= f = \r -> f (m r) r
并进行以下计算:
double :: Num r => Reader r r
double = do
v <- id
return (2*v)
这是函数Monad,有点难理解。顺便说一下,它有时被称为Reader Monad。我认为最好的方法是通过一个例子来说明它的工作原理:
f1 :: Double -> Double
f1 x = 10 * x + x ** 2 + 3 * x ** 3
f2 :: Double -> Double
f2 = do
x1 <- (10 *)
x2 <- (** 2)
x3 <- (** 3)
return $ x1 + x2 + 3 * x3
return
一个值时,你返回的是一个函数。f2
的隐式参数会作为一个隐式参数传递给每一个<-
。如果你有很多带有相同参数的子表达式,它可以非常有用。正如Reader monad一样,它通常用于提供只读配置值。