不使用变量< -

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)


n. *_* m. 16

首先,<-不是运营商.这是一个特殊的语法元素,左侧需要一个模式.

其次,如果它是一个中缀运算符,则$ <-不起作用,因为你不能让两个中缀运算符彼此相邻.


bhe*_*ilr 6

<-"提取物"一个从一个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"版本,但它会变得非常非常困难.该注释简化了这一点,并使编译器为您处理它.