monad绑定和单位函数的差异?

时间:2012-07-25 20:04:09

标签: haskell monads

问题

我正在阅读You Could Have Invented Monads!教程,以及名为 A Container:Multivalued Functions 的部分,其中函数类型(复杂的方形和立方根)是:

Complex Float -> [Complex Float]

Bind定义为:

bind :: (Complex Double -> [Complex Double]) -> ([Complex Double] -> [Complex Double])
bind f x = concat (map f x)
--shortcut:
f * g = bind f . g 

单位和电梯是:

unit x = [x]    
lift f = unit . f

现在我感到困惑,f函数中的lift是否与f函数中的bind相同? 换句话说,unitlift函数的类型是什么?

悖论

另外,根据我的推理,我遇到了一个奇怪的悖论:如果lift可以采取如下函数:

realRoot :: Double -> Double
realRoot x =  sqrt(x)

并将其提升到我们的monad中,使其变为类型:

lift realRoot :: [Complex Double]

我不能做这样的事情:

(lift realRoot * imaginaryRoot) -1

,其中

imaginaryRoot :: [Complex Double]

但我怎样才能使用复杂数字的真正的根?

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

  

现在我很困惑,f函数中的lift是否与绑定函数中的f相同?换句话说,unitlift函数的类型是什么?

不,这不一样。 lift的参数是函数Complex Double -> Complex Double,所以

unit :: Complex Double -> [Complex Double]
lift :: (Complex Double -> Complex Double) -> (Complex Double -> [Complex Double])

因此realRoot不是lift的可接受参数。