2011-03-01 51 views
3

一些作家在一些家庭作業上工作得很好,但一位老師向我展示了這一點。它令我的大腦難以理解其格式,以及它的工作方式?我試圖調整它來了解它,但我不明白。有人可以解釋這個哈斯克爾?

fun2 :: String -> [String] 
fun2 [] = [] 
fun2 (x:xs) = [fun1 (x:xs)] ++ runs (drop (length (munch (x:xs))) (x:xs)) 

FUN1是:

fun1 (x:xs) = group (x:xs) 

有人能在學習的輔助工具打破這種下來嗎?使用一個功能到另一個是需要的工作。

再次,這是作業,我只是要求指導理解哈斯克爾,因爲我不能得到我的頭!

+3

請寫出哪些模塊被導入。否則,不可能知道'munch'是指哪個函數。那麼'runs'是如何定義的? – mrueg 2011-03-01 23:31:15

+3

該代碼的作者有不尋常的風格; '(x:xs)'上的模式匹配似乎沒有用處。 'Fun1'我想象的實際上並沒有大寫,因爲這將是一個無效的函數名稱。 – 2011-03-02 00:30:59

回答

3

一些僞解釋時FUN2叫什麼的事情:

if the argument is [] (the empty list) 
    return [] 
else (the argument is a non-empty list x:xs) 
    fun1Result = fun1 (x:xs) 
    fun1List = [fun1result] -- a list of one element 
    munchResult = munch (x:xs) 
    lengthResult = length munchResult 
    dropResult = drop lengthResult (x:xs) 
    runsResult = runs dropResult 
    return fun1List ++ runsResult -- concatenate the two lists 

在Haskell,應用功能只是通過將功能和參數之間的空間。所以f x調用函數f與價值x。功能應用程序從左到右進行評估,所以括號只是爲了確保所有事情都按照正確的順序進行。

希望這使得語法不易混淆。我不認爲munchruns是標準功能,所以我只能猜測他們做了什麼。