2016-04-09 27 views
-1

ya dosyayı ayrıştırmak için geçilen veya standart girdiden okunan ifadesinde Bağlama:Ben dosya adıyla kuyrukkakanı argüman üzerinde çalışıyorum

let formulae = fmap parseInput $ if isInputFile args then (hGetContents $ openFile (last args) ReadMode) else hGetContents stdin 

ama tabii bu hata oluşur:

formula-2-bdd.hs:89:79: 
    Couldn't match expected type `Handle' with actual type `IO Handle' 
    In the second argument of `($)', namely 
     `openFile (last args) ReadMode' 
    In the expression: (hGetContents $ openFile (last args) ReadMode) 

Ben GÇ ilk Kulp bağlamak ben isInputFile args `e göre karar olamaz:

handle <- openFile (last args) ReadMode 
formulae = fmap parseInput $ if isInputFile args then hGetContents handle else hGetContents stdin 

cevap

1

en w anlayalım Orijinal let ifadesi ile gerçek sorunu ifade eder.

let formulae = fmap parseInput $ if isInputFile args 
           then (hGetContents $ openFile (last args) ReadMode) 
           else hGetContents stdin 

sorun openFile dönüş değeri bir IO Handle iken stdin bir Handle olmasıdır. Her iki durumda da aynı kodla başa çıkmak için (hiçbir amaç belirtilmemiştir), stdin3'ü bir IO Handle numaralı telefona tanıtmanız gerekir.

let formulae = fmap parseInput $ if isInputFile args 
           then (hGetContents $ openFile (last args) ReadMode) 
           else (hGetContents (pure stdin)) 

Bu

biraz daha basit if ifadenin sonucuna hGetContents çağıran yerine if ifadesi hGetContents sonucunu döndürmek sahip yeniden yazılabilir.

let formulae = do handle <- if isInputFile 
          then openFile (last args) ReadMode 
          else return stdin 
        data <- hGetContents handle 
        fmap parseInput data 
İlgili konular