2012-06-12 114 views
1

這有點長,所以請耐心等待!Haskell Noob需要幫助

我在使用Haskell程序時遇到了一些麻煩,我必須使用它作爲uni項目的一部分。作爲參考,它是Casper

所以,你應該執行一個腳本,它實際上是一個bash腳本調用擁抱的解釋是這樣的:

exec $HUGSBIN/hugs $HUGSARGS +p"Casper> " $FILES 

其中$ FILES指向Main.lhs文件。

之後,我需要在解釋器中調用一個帶有文件路徑的「compile」函數。

我需要以腳本方式執行上述操作。我需要這種自動化,因爲我正在編寫一個程序,在後臺調用Casper。

所以我編譯了.lhs文件。現在我想執行「編譯」功能,但我不知道這是如何完成的。我嘗試:

./Main compile <a path> 

從命令行但它返回一個關於文件「測試」未找到錯誤。經過調查,我在Main.lhs文件中看到這些行:

>main :: String -> IO() 
>main = compile "test" 

>compile :: String -> IO() 
>compile s = catch (compile0 False s) handler 

[...snipped] 

第二行解決了這個問題。現在我的問題是,如何在編譯main.lhs之後調用「compile」函數並傳遞路徑給它?從解釋器中,我只需鍵入「compile」並且它可以工作,但是在編譯main.lhs並從命令行執行後,我無法獲得相同的工作。任何想法爲什麼?如果一切都失敗了,有什麼辦法可以編寫擁抱?

謝謝你的幫助!

+0

用 – applicative

+0

代替'main'把主體替換成? –

回答

4

您可以通過getArgs訪問傳遞給Haskell程序的命令行參數。例如,它聽起來像你想要一個這樣的主要功能:

>main = do 
> args <- getArgs 
> case args of 
>  [] -> putStrLn "What file did you want me to compile?" 
>  [filename] -> compile filename 
>  _ -> putStrLn "I only compile one file at a time." 

修改成品味。

+0

工作正常!非常感謝!你能解釋你的代碼做什麼嗎?除了對Haskell不熟悉之外,我有點了解它。我特別想知道最後3行的含義。我假設:空字符串,打印消息。如果提供了arg,則將其稱爲「文件名」並調用「編譯文件名」。如果多於一個參數,告訴最後一條消息? –

+0

@ Inf.S:這基本上是正確的。'getArgs'是一個給出命令行參數列表的動作。第一行將此列表綁定到名稱「args」。列表可以具有可變數量的元素,因此最後一行在列表上進行模式匹配以找出如何繼續。如果'args'與空列表匹配,則顯示消息。如果args與單個元素匹配列表,則調用該元素'filename'並繼續編譯該文件。最後一行使用'_'來匹配。這是一種特殊情況的匹配,總是成功的,但是模式匹配的規則是從上到下匹配(續) – Boris

+0

@ Inf.S :(續)如果匹配成立,它意味着前兩行不匹配,所以它必須是兩個或更多元素的列表。如果最後一行是'case args of'後面的第一行,那麼程序只會打印'「我一次只編譯一個文件」,不管它有多少個參數。 – Boris

2

替換main

main = getArgs >>= \(arg1:_) -> compile arg1 

這將第一命令行參數(arg1)傳遞給compile而不是 「檢驗」,而忽略其餘的(_)。您可能需要添加

import System 

import System.Environment 

我不記得什麼需要擁抱這一點。

+0

我得到這個:Main.lhs:31:9:不在範圍內:'getArgs'。想法?] –

+0

這是「>導入System.Environment」。我使用了Daniel Wagner的代碼,因爲它對我來說更加清晰。但你的作品也是!謝謝! –