我正在阅读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
相同?
换句话说,unit
和lift
函数的类型是什么?
另外,根据我的推理,我遇到了一个奇怪的悖论:如果lift
可以采取如下函数:
realRoot :: Double -> Double
realRoot x = sqrt(x)
并将其提升到我们的monad中,使其变为类型:
lift realRoot :: [Complex Double]
我不能做这样的事情:
(lift realRoot * imaginaryRoot) -1
,其中
imaginaryRoot :: [Complex Double]
但我怎样才能使用复杂数字的真正的根?
任何帮助表示赞赏!
答案 0 :(得分:2)
现在我很困惑,
f
函数中的lift
是否与绑定函数中的f
相同?换句话说,unit
和lift
函数的类型是什么?
不,这不一样。 lift
的参数是函数Complex Double -> Complex Double
,所以
unit :: Complex Double -> [Complex Double]
lift :: (Complex Double -> Complex Double) -> (Complex Double -> [Complex Double])
因此realRoot
不是lift
的可接受参数。