【问题标题】:haskell expression evaluationhaskell 表达式求值
【发布时间】:2015-05-11 18:09:35
【问题描述】:

我是 haskell 的新手,希望您对以下 haskell 表达式求值提出建议。

f xs = foldr (\x n->n+1) 0 xs

功能

f [1, 4]

评估

(\x n->n+1) 1 (foldr  (\x n->n+1) 0 [4])
= (foldr  (\x n->n+1) 0 [4]) + 1
= ((\x n->n+1) 4 (foldr  (\x n->n+1) 0 [4])) + 1
= (foldr  (\x n->n+1) 0 [] + 1) + 1
= (0 + 1) + 1 
= 1 + 1
= 2

【问题讨论】:

  • 代码有问题吗?
  • @thefourtheye 代码工作正常,但我不确定这一行是否 '((\x n->n+1) 4 (foldr (\x n->n+1) 0 [4 ])) + 1' 是正确的,或者应该是 '((\x n->n+1) 4 (foldr (\x n->n+1) 0 [])) + 1'
  • 请编辑问题并清楚说明您的意图。
  • 我只想知道我的评价是否正确,如果不正确,请告诉我哪里错了。

标签: haskell evaluation


【解决方案1】:

首先我们需要 foldr 实现:

foldr f z []     = z 
foldr f z (x:xs) = f x (foldr f z xs)

现在让我们尝试“追踪”我们的计算f [1, 4]

f [1, 4]  -- rewrite list 
f (1:(4:[]))  -- replace f function where xs = (1:(4:[]))
foldr (\x n-> (+) n 1 ) 0 (1:(4:[])) 

-- using foldr f z (x:xs) = f x (foldr f z xs)
-- where f = (\x n -> (+) n 1), z = 0, x = 1, xs = (4:[])
(\x n ->(+) n 1) 1 ( foldr (\x n -> (+) n 1) 0 (4:[]))

-- lambda function will be evaluated with x = 1, n = ( foldr (\x n -> n+1) 0 (4:[]))
(+) (foldr (\x n -> n+1) 0 (4:[])) 1

-- (+) will try to evaluate first parameter
-- foldr will be applied with f = (\x n -> (+) n 1), z = 0,  x = 4, xs = []
(+) ((\x n -> (+) n 1) 4 (foldr (\x n -> (+) n 1) 0 [] )) 1

-- now again the lambda will be evaluated where x = 4 and n = (foldr (\x n -> (+) n 1) 0 [] )

(+) ( (+) (foldr (\x n -> (+) n 1) 0 [] ) 1 ) 1

--  now foldr will be evaluated again but this time first form will be used, so just z counts: f = (\x n -> (+) n 1), z = 0, [] = []
(+) ( (+) ( 0 ) 1 ) 1

-- now just go with the flow
(+) ( (+) 0 1 ) 1
(+) ( 1 ) 1
(+) 1 1
2

【讨论】:

    猜你喜欢
    • 2019-09-06
    • 1970-01-01
    • 2013-05-14
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多