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

今、私は混乱しています.in関数はinf関数liftと同じですか?つまり、and関数の型は何ですか?fbindunitlift

逆説

また、私の推論では、奇妙なパラドックスに到達します。次のliftような関数を使用できる場合:

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

それをモナドに持ち上げて、次の型になるようにします。

lift realRoot :: [Complex Double]

次のようなことはできませんか?

(lift realRoot * imaginaryRoot) -1

どこ

imaginaryRoot :: [Complex Double]

しかし、どうすれば複素数の根を求めることができるでしょうか?

どんな助けでも大歓迎です!

4

1 に答える 1

2

今、私は混乱していますf.in関数はbind関数liftと同じですか?fつまり、unitandlift関数の型は何ですか?

いいえ、同じではありません。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 に答える