繁体   English   中英

最左-最内和最外(Haskell)

[英]Leftmost-Innermost and Outermost(Haskell)

您好我有一个问题,我不太了解 Function 中 Haskell 的减少:

removeone :: Eq a = > a -> [ a ] -> [ a ]
removeone _ [] = [] 
removeone x ( y : ys ) 
   | x == y  =  removeone x ys
   | otherwise =  y : ( removeone x ys )

remdups :: Eq a = > [ a ] -> [ a ]
remdups [] = []
remdups ( x : xs ) = x : remdups ( removeone x xs )

我如何使用这个 function 来解释列表中的缩减步骤(例如remdups [3,7,3,7,5,7]

remdups [3,7,3,7,5,7]开始,并尽可能将表达式简化为左侧。 请记住[x,y,z]x:y:z:[]的简写。 因此 remdups (3:7:....) = 3: remdups (removeone 3 (7:....)) =...现在你需要使用removeone的定义,因为没有适用的remdups方程。 removeone生成:[]后,您将返回简化remdups调用。

一排是一减少。

remdups [3,7,3,7,5,7]
3:remdups (removeone 3 [7,3,7,5,7])
3:remdups (7:(removeone 3 [3,7,5,7]))
3:remdups (7:(removeone 3 [7,5,7]))
3:remdups (7:(7:(removeone 3 [5,7])))
3:remdups (7:(7:(5:(removeone 3 [7]))))
3:remdups (7:(7:(5:(7:(removeone 3 [])))))
3:remdups (7:(7:(5:(7:([])))))
3:remdups [7,7,5,7] -- shorthand
3:7:remdups (removeone 7 [7,5,7])
3:7:remdups (removeone 7 [5,7])
3:7:remdups (5:(removeone 7 [7]))
3:7:remdups (5:(removeone 7 []))
3:7:remdups (5:([]))
3:7:remdups [5] -- shorthand
3:7:5:remdups (removeone 5 [])
3:7:5:remdups ([])
3:7:5:remdups [] -- shorthand
3:7:5:[]
[3,7,5] -- shorthand

在伪代码中,我们有

rem1 x (x:t)  =   rem1 x t
rem1 x (a:t)  = a:rem1 x t                    ;  rem1 x [] = []

remdups (a:t) = a:remdups (rem1 a t)          ;  remdups [] = []

Innermost-Leftmost(急切评估):

remdups               [3,7,3,7,5,7]
= 3:  remdups   (rem1 3 [7,3,7,5,7])
= 3:  remdups   (7:rem1 3 [3,7,5,7])
= 3:  remdups   (7:  rem1 3 [7,5,7])
= 3:  remdups   (7:7:  rem1 3 [5,7])
= 3:  remdups   (7:7:5:  rem1 3 [7])
= 3:  remdups   (7:7:5:7: rem1 3 [])
= 3:  remdups   (7:7:5:7: []       )
= 3: 7:  remdups  (rem1 7 (7:5:7:[]))
= 3: 7:  remdups  (  rem1 7 (5:7:[]))
= 3: 7:  remdups  (  5:rem1 7 (7:[]))
= 3: 7:  remdups  (  5:  rem1 7 ([]))
= 3: 7:  remdups  (  5:  []         )
= 3: 7: 5:  remdups  (rem1 5     [] )
= 3: 7: 5:  remdups  []
= 3: 7: 5: []       -- 15 reductions

最外层(Haskell 在做什么):

remdups                               [3,7,3,7,5,7]
= 3:                   remdups  (rem1 3 [7,3,7,5,7])
= 3:                   remdups  (7:rem1 3 [3,7,5,7])
= 3: 7:          remdups  (rem1 7 (rem1 3 [3,7,5,7]))
= 3: 7:          remdups  (rem1 7 (  rem1 3 [7,5,7]))
= 3: 7:          remdups  (rem1 7 (7:  rem1 3 [5,7]))
= 3: 7:          remdups  (rem1 7 (    rem1 3 [5,7]))
= 3: 7:          remdups  (rem1 7 (   5: rem1 3 [7]))
= 3: 7:          remdups  (5:rem1 7 (    rem1 3 [7]))
= 3: 7: 5: remdups  (rem1 5 (rem1 7 (    rem1 3 [7])))
= 3: 7: 5: remdups  (rem1 5 (rem1 7 ( 7: rem1 3  [])))
= 3: 7: 5: remdups  (rem1 5 (rem1 7 (    rem1 3  [])))
= 3: 7: 5: remdups  (rem1 5 (rem1 7      []         ))
= 3: 7: 5: remdups  (rem1 5 []                       )
= 3: 7: 5: remdups  []   
= 3: 7: 5: []       -- 15 reductions

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM