2013-09-27 8 views
8

Dieser Code funktioniert offensichtlichmit nicht eine Variable für <-

import Data.Char 

main = do 
    content <- readFile "in.txt" 
    writeFile "out.txt" (map toUpper content) 

Warum dieses nicht der Fall ist?

import Data.Char 

main = do 
    writeFile "out.txt" (map toUpper $ <- readFile "in.txt") 

Antwort

17

folgt Da dies nicht der Fall, wie <- definiert ist. Er übersetzt zu

readFile "in.txt" >>= \content -> 
writeFile "out.txt" (map toUpper content) 

Sie =<< stattdessen verwenden:

writeFile "out.txt" . map toUpper =<< readFile "in.txt" 
3

können Sie es zu schreiben, wie

readFile "in.txt" >>= writeFile "out.txt" . map toUpper 
+0

Oder 'map toUpper <$> readFile" in.txt ">> = Schreibdatei" out.txt "'. Ich denke jedoch, dass das OP eine Erklärung und keine bloße Lösung wollte – nponeccop

17

Zuerst <- kein Operator ist. Es ist ein spezielles Syntaxelement, das auf der linken Seite ein Muster erfordert. Wenn es ein Infix-Operator wäre, würde $ <- zweitens nicht funktionieren, da Sie nicht zwei Infix-Operatoren nebeneinander haben können.

6

Die <- "extrahiert" einen Wert aus einem monadischen Container. IO ist eine Monade und kann daher zum Extrahieren eines Werts aus einer IO Aktion verwendet werden. Die Syntax von Haskell besagt jedoch, dass Sie binden müssen, bevor Sie es verwenden. Tatsächlich ist die kein Operator, sondern syntaktischer Zucker für den Operator >>= (ausgesprochen "bind"). Also, wenn Sie

schreiben
main = do 
    contents <- readFile "in.txt" 
    writeFile "out.txt" (map toUpper contents) 

Es wird verwandelte sich in

main = readFile "in.txt" >>= (\contents -> writeFile "out.txt" (map toUpper contents)) 

Nun, wenn Sie sich vorstellen in main viel mehr Aussagen hatte. Vielleicht haben Sie mehrere Werte mit <- extrahiert, und einige Ausdrücke haben mehr als einen dieser Werte gleichzeitig verwendet. Man könnte definitiv die "entzuckerte" Version schreiben, aber es würde sehr, sehr schwierig werden. Die Do-Notation vereinfacht dies und sorgt dafür, dass der Compiler sich darum kümmert.

Verwandte Themen