Tsh*_*nga 2 monads haskell functional-programming syntactic-sugar comonad
所以我正在玩GHCi中的hasbolt模块,我对一些贬低有好奇心.我通过创建管道连接到Neo4j数据库,如下所示
ghci> pipe <- connect $ def {credentials}
Run Code Online (Sandbox Code Playgroud)
这工作得很好.但是,我想知道(<-)运营商的类型是什么(GHCi不会告诉我).最令人沮丧的解释描述了这一点
do x <- a
return x
Run Code Online (Sandbox Code Playgroud)
des to to to
a >>= (\x -> return x)
Run Code Online (Sandbox Code Playgroud)
但是这条线x <- a怎么样?它并不能帮助我在加return我想是因为pipe :: Pipe没有pipe :: Control.Monad.IO.Class.MonadIO m => m Pipe,但(>>=) :: Monad m => m a -> (a -> m b) -> m b这样尝试使用到desugar bind和return/ pure不无它的工作.
理想情况下,似乎最好只创建一个Comonad实例来启用使用extract :: Monad m => m a -> a,pipe = extract $ connect $ def {creds}但它让我感到困惑,我不明白(<-).
另一个奇怪的是,(<-)作为haskell函数,它的第一个参数是一个超出范围的变量,但这并不意味着
(<-) :: a -> m b -> b
Run Code Online (Sandbox Code Playgroud)
因为不只是任何东西都可以用作自由变量.例如,您无法将管道绑定到Num类型或Bool.变量必须是"String"ish的东西,除非它实际上不是String; 你绝对不能尝试实际绑定到String.所以它似乎不是通常意义上的haskell函数(除非有一类函数从自由变量命名空间中取值...不太可能).那究竟是(<-)什么?是否可以完全替换使用extract?这是desugar /绕过它的最好方法吗?
我想知道(< - )运算符的类型是什么......
<-没有一个类型,它的语法的一部分do符号,你知道这是转化为序列>>=和return过程被称为脱糖中.
但是x < - a ......线怎么样?
这是正常haskell代码中的语法错误,编译器会抱怨.这条线的原因:
ghci> pipe <- connect $ def {credentials}
Run Code Online (Sandbox Code Playgroud)
在ghci中工作的是repl是一种do块; 你可以把每个条目都想象成你的main函数中的一条线(它比那更毛茸茸,但这是一个很好的近似).这就是为什么你需要(直到最近)let foo = bar在ghci中声明一个绑定.