Ich möchte eine Datei lesen, verarbeiten und die Ergebnisse in eine andere Datei schreiben; Der Name der Eingabedatei muss über ein Konsolenargument angegeben werden. Der Name der Ausgabedatei wird aus dem Namen der Eingabedatei generiert.bedingte Standard-Handle-Umleitung in Haskell
Der Haken ist, ich will es transparent "fail over" zu stdin/stdout, wenn keine Argumente geliefert werden; Im Wesentlichen, falls ein Dateiname angegeben wird, leite ich stdin/stdout zu den entsprechenden Dateinamen um, so dass ich interact transparent verwenden kann, egal ob der Dateiname angegeben wurde oder nicht.
Hier ist der Code zusammen mit Dummy-Ausgang in einem überflüssigen else gehackt. Was wird die richtige, idiomatische Form sein, es zu tun?
Es könnte wahrscheinlich etwas mit Control.Monad ist zu tun, wenn oder Wache, wie es in einer ähnlichen Frage erwähnt, aber vielleicht jemand schon schrieb.
import System.IO
import Data.Char(toUpper)
import System.Environment
import GHC.IO.Handle
main :: IO()
main = do
args <- getArgs
if(not $ null args) then
do
print $ "working with "++ (head args)
finHandle <- openFile (head args) ReadMode --open the supplied input file
hDuplicateTo finHandle stdin --bind stdin to finName's handle
foutHandle <- openFile ((head args) ++ ".out") WriteMode --open the output file for writing
hDuplicateTo foutHandle stdout --bind stdout to the outgoing file
else print "working through stdin/redirect" --get to know
interact ((++) "Here you go---\n" . map toUpper)
Vielen Dank für Entzuckerung 'interagieren ', hätte eigentlich gedacht, es zu tun, dieser Code löst das Problem auf jeden Fall, und es ist auch portabler (' hDuplicateTo' ist GHC-spezifisch, es fehlt im Haskell Report von 2010). – yvs314