English 中文(简体)
B. 共同再次入侵模式
原标题:Common recursion pattern

I m 被用于Haskell高档功能。 通常,我能够以像地图、双倍和扫描等功能取代明显的再入侵模式。 然而,我常常陷入以下再入侵模式,我不理解如何使用较高顺序的职能:

   f (x:[]) = k x
   f (x:xs) = g x (f xs)

例如,我代表分析表。 然后,我设定了数据类型,例如:

   data Tableau = N Expr | S Expr (Tableau) | B Expr (Tableau) (Tableau)

如果我想转换一个<代码>清单 摘自,进入桌面结构,我希望其职能部分可能类似:

   f (x:[]) = N x
   f (x:xs) = S x (f xs)

现在,我看到三种选择:(1) 产生一种功能,根据表格和清单决定表au的下一个分支是否应为<代码>S或N(或B,但忽略了这一情形);(2) 采用较高顺序的功能来概括<代码>f的再入侵模式;(3) 使用/code>等功能。

什么是最佳选择?

最佳回答

我很可能使用以下方法:

f xs = foldr g (k (last xs)) (init xs)

基本意思是,名单的结尾在夹时改为k x。 由于各地都存在“幻觉”评价,该评价甚至用于确定清单。

还有两种解决办法——增加空洞案例和使用玛雅人。

A) 添加空话:

如果对<代码>f[]加以明确界定,则最好如此。 然后,你可以将定义写成

f [] = c
f (x:xs) = g x (f xs)

页: 1 例如,如果你改变,

data Tableau = N Expr | S Expr Tableau | B Expr Tableau Tableau

纽约总部

data Tableau = N | S Expr Tableau | B Expr Tableau Tableau

然后,你可以代表单一内容表格,作为<条码>,Splicar N,该功能被定义为一行。

f = foldr S N

只要空洞案件有意义,它就是一个最佳解决办法。

B. 玛雅人的使用:

On the other hand, if f [] cannot be sensibly defined, it s worse. Partial functions are often considered ugly. To make it 纽约总部tal, you can use Maybe. Define

 f [] = Nothing
 f [x] = Just (k x)
 f (x:xs) = Just (g x w)
            where Just w = f xs

It is a 纽约总部tal function - that s better.

But now you can rewrite the function in纽约总部:

 f [] = Nothing
 f (x:xs) = case f xs of
              Nothing -> Just (k x)
              Just w -> Just (g x w)

这是正确的:

 addElement :: Expr -> Maybe Tableaux -> Maybe Tableaux
 addElement x Nothing = Just (N x)
 addElement x (Just w) = Just (S x w)

 f = foldr addElement Nothing

In general, folding is idiomatic and should be used when you fit the recursion pattern. Otherwise use explicit recursion or try 纽约总部 reuse existing combina纽约总部rs. If there s a new pattern, make a combina纽约总部r, but only if you ll use the pattern a lot - otherwise it s overkill. In this case, the pattern is fold for nonempty lists defined by: data List a = End a | Cons a (List a).

问题回答

如果我正确理解这个问题,那么我就在此评估你的选择:

  1. 也许需要从建筑商的底部中调取(表面上是任意的复杂)面表,以写这一功能。 这种做法似乎有些麻烦,尽管可能只是罚款。

  2. 我不认为需要把这种模式概括起来,因为这是一种在休养结构下运作的休养职能。 采用较高顺序的模式(我认为)会排除实际逻辑,而这种逻辑又是重复这种数据结构。

  3. 我认为,这非常有意义。 如你所说,它是一个得到合理承认的“主人”,但我认为它与算法的描述完全吻合。 这可能不是一般性的或可重复的,但鉴于它从根本上讲是算法的核心,我认为,直接撰写案件与你在f类职能中所做的一样是明智的。 这将是我赞成的做法。

如果不提供特别具体的答复,但这是一个相当主观的答案,因此,鉴于上述三种选择,我将选择方案3,因为明确性和可读性。





相关问题
Recursive same-table query in SQL Server 2008

I have the following table in a SQL Server 2008 database: Id Name ParentFolder -- ---- ------------ 1 Europe NULL 2 Asia NULL 3 Germany 1 4 UK 1 5 China ...

Finding a class within list

I have a class (Node) which has a property of SubNodes which is a List of the Node class I have a list of Nodes (of which each Node may or may not have a list of SubNodes within itself) I need to be ...

Selecting records during recursive stored procedure

I ve got a content management system that contains a hierarchical structure of categories, with sub-categories subject to different ordering options at each level. Currently, that s retrieved by a (...

热门标签