2017-01-22 29 views
0

我有一些Haskell代碼,需要寫下最左邊最裏面(按值調用)和(調用 - 名):找到最外層的評價(哈斯克爾)

second :: [Int] -> Int 
second []   = 0 
second (_:[])  = 0 
second (_:x:xs)  = x 

doubleEach :: [Int] -> [Int] 
doubleEach []   = [] 
doubleEach (x:xs) = x * 2 : (doubleEach xs) 

repeat :: Int -> Int -> [Int] 
repeat x n = if n > 0 then x : (repeat x (n-1)) else [] 


repeat (second (doubleEach [2,3,5])) (second [3, 1, 4]) 

最裏面(調用 - 值):

1. repeat (second (doubleEach [2,3,5])) (second [3,1,4]) 
2. repeat (second 4 : doubleEach [3,5])) (1) 
3. repeat (second (4 : 6 : d [5])) (1) 
4. repeat (second (4 : 6 : 10)) (1) 
5. repeat (6) (1) 
6. [6] 

問題:我怎樣才能得到最外層(調用 - 名)一步evalua撲進重刑?我不明白我如何能夠做到這一點,如果重複需要指定值的工作,他們不會給予,直到內部沒有評估。

+2

這是很不清楚你想要什麼,你想壓縮一些字符串?請向我們展示完整的預期產出。 –

+0

每個程序都可以按值調用和按名稱策略運行。我不明白如何編寫程序爲按名稱策略運行的步驟。我希望我的意思更清楚。 – jublikon

+5

這不是真的哈斯克爾。我甚至不確定它確實屬於Stackoverflow ...也許cs.stackexchange? – Alec

回答

2

如何獲得最外層(按名稱)逐步評估?我不明白我如何能夠做到這一點,如果重複需要指定值的工作,他們不會給予,直到內部沒有評估。

您不需要這些值來展開函數調用 - 您可以傳入未經評估的表達式。然後,只有在需要if s,模式匹配或原始函數時才評估這些表達式。這就是按名稱評估的工作原理。

所以,你的第一步是採取repeat身體,更換的xsecond (doubleEach [2,3,5])每次出現的n每次出現second [3, 1, 4]。然後,您需要評估if條件,然後繼續執行if的正文。