8 haskell
这段代码显然有效
import Data.Char
main = do
content <- readFile "in.txt"
writeFile "out.txt" (map toUpper content)
Run Code Online (Sandbox Code Playgroud)
为什么这个没有?
import Data.Char
main = do
writeFile "out.txt" (map toUpper $ <- readFile "in.txt")
Run Code Online (Sandbox Code Playgroud)
Fre*_*Foo 16
因为这不是如何<-定义的.它转化为
readFile "in.txt" >>= \content ->
writeFile "out.txt" (map toUpper content)
Run Code Online (Sandbox Code Playgroud)
你可以=<<改用:
writeFile "out.txt" . map toUpper =<< readFile "in.txt"
Run Code Online (Sandbox Code Playgroud)
的<-"提取物"一个从一个monadic容器值. IO是一个monad,因此它可以用来从一个IO动作中提取一个值.但是,Haskell的语法表示在使用它之前必须将其绑定到名称.实际上,它<-根本不是操作符,而是>>=操作符的语法糖(发音为"bind").所以当你写作
main = do
contents <- readFile "in.txt"
writeFile "out.txt" (map toUpper contents)
Run Code Online (Sandbox Code Playgroud)
它变成了
main = readFile "in.txt" >>= (\contents -> writeFile "out.txt" (map toUpper contents))
Run Code Online (Sandbox Code Playgroud)
现在,想象一下你是否有更多的陈述main.也许您使用了多个值<-,并且某些表达式一次使用多个值.你绝对可以编写"desugared"版本,但它会变得非常非常困难.该注释简化了这一点,并使编译器为您处理它.