所以我正在玩 GHCi 中的 hasbolt 模块,我对一些脱糖感到好奇。我一直通过如下创建管道连接到 Neo4j 数据库
ghci> pipe <- connect $ def {credentials}
这很好用。但是,我想知道(<-)
运算符的类型是什么(GHCi 不会告诉我)。大多数脱糖的解释描述了
do x <- a
return x
脱糖
a >>= (\x -> return x)
但是只有这条线呢x <- a
?添加它对我没有帮助,return
因为我不想pipe :: Pipe
,pipe :: Control.Monad.IO.Class.MonadIO m => m Pipe
但是如果没有它,(>>=) :: Monad m => m a -> (a -> m b) -> m b
尝试使用bind
and return
/来脱糖pure
是行不通的。
理想情况下,似乎最好只创建一个Comonad
实例以启用extract :: Monad m => m a -> a
aspipe = extract $ connect $ def {creds}
但它让我不明白(<-)
。
另一个奇怪的是,(<-)
作为haskell函数,它的第一个参数是一个超出范围的变量,但这并不意味着
(<-) :: a -> m b -> b
因为不仅仅是任何东西都可以用作自由变量。例如,您不能将管道绑定到Num
类型或Bool
. 变量必须是一个“字符串”的东西,除非它实际上不是一个String
; 而且您绝对不能尝试实际绑定到String
. 所以它似乎不是通常意义上的haskell函数(除非有一类函数从自由变量命名空间中获取值......不太可能)。那么究竟是(<-)
什么?可以用 using 完全替换extract
吗?这是脱糖/规避它的最佳方法吗?