0

问题

我只是通过你可以发明单子!教程,并在标题为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

现在我很困惑,fin函数和in函数lift一样吗?换句话说,和函数的类型是什么?fbindunitlift

悖论

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

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

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

lift realRoot :: [Complex Double]

我不能做这样的事情:

(lift realRoot * imaginaryRoot) -1

在哪里

imaginaryRoot :: [Complex Double]

但是我怎样才能得到复数的真正根呢?

任何帮助表示赞赏!

4

1 回答 1

2

现在我很困惑,finlift函数和fbind函数一样吗?换句话说,unitlift函数的类型是什么?

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

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

因此,您realRoot的论点是不可接受的lift

于 2012-07-25T20:16:10.310 回答