2017-01-22 21 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的正文。