私はGHCiのhasboltモジュールをいじっていて、いくつかの脱糖に興味がありました。次のようにパイプを作成して、Neo4j データベースに接続しています。
ghci> pipe <- connect $ def {credentials}
そしてそれはうまくいきます。しかし、(<-)
演算子の型が何なのか気になります (GHCi は教えてくれません)。ほとんどの脱糖の説明は、
do x <- a
return x
脱糖する
a >>= (\x -> return x)
しかし、行だけはx <- a
どうですか?return
したくpipe :: Pipe
ないのでを追加しても役に立ちませんが、 and /を使用して脱糖しようとするとpipe :: Control.Monad.IO.Class.MonadIO m => m Pipe
、それなしでは機能しません。(>>=) :: Monad m => m a -> (a -> m b) -> m b
bind
return
pure
理想的には、 asComonad
を使用できるようにインスタンスを作成するのが最善のように思えますが、私には理解できないので困っています。extract :: Monad m => m a -> a
pipe = extract $ connect $ def {creds}
(<-)
もう1つの奇妙な点は、(<-)
haskell関数として扱うと、最初の引数が範囲外の変数であるということですが、それはそれを意味するものではありません
(<-) :: a -> m b -> b
何でも自由変数として使用できるわけではないからです。たとえば、パイプをNum
型やBool
. 変数は、実際にはString
;ではないことを除いて、「文字列」っぽいものでなければなりません。実際ににバインドしようとすることは絶対にできませんString
。したがって、通常の意味での haskell 関数ではないように見えます (自由変数の名前空間から値を取得する関数のクラスがない限り... 可能性は低いです)。では、(<-)
正確には何ですか?を使用して完全に置き換えることはできますextract
か? それは脱糖/回避する最良の方法ですか?