问题
我只是通过你可以发明单子!教程,并在标题为A Container: Multivalued Functions的部分中,其中函数类型(复平方根和立方根)为:
Complex Float -> [Complex Float]
绑定定义为:
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
in函数和in函数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]
但是我怎样才能得到复数的真正根呢?
任何帮助表示赞赏!