【问题标题】:Numeration count inside a recursive function递归函数内的计数
【发布时间】:2015-12-04 01:29:13
【问题描述】:

我想做类似的事情:

>enumerate ["banana", "potato", "ice"]
[(1, "banana"), (2, "potato"), (3, "ice")]

我写道:

enumerate :: [String] -> [(Int, String)]
enumerate [] = []

如何控制/管理 int 计数器?没有支持功能有没有办法做到这一点?

更新:我知道Zip 函数。但是为了学习,我想实现自己的 zip 功能。

更新 2:当前代码

这是我到目前为止所做的,使用支持功能。考虑到:

1) 我想实现自己的zip函数;
2)我不想改变函数结构:

   enumerate :: [String] -> [(Int, String)]  

enumerate :: [String]->[(Int,String)]
enumerate [] = []
enumerate list = aux 1 list


aux :: Int->[String]->[(Int, String)]
aux _ [] = []
aux i (x:xs) = [(i, x)] ++ aux (i+1) xs

这个功能可以改进吗?由于我不想在函数中添加最后一个,所以我认为支持函数是唯一的方法,对吧?

【问题讨论】:

  • 最后一个aux 看起来不错。对于风格,我会将[(i,x)] ++ ... 更改为(i,x) : ...
  • 您不需要enumerate [] = [],因为您已经在aux 函数中处理空列表。事实上你可以写enumerate = aux 1
  • @homam 和 aux 函数如何识别列表?谢谢chi,效果很好。我以为我可以在elem : list 中使用:
  • aux 是来自aux :: Int -> [String] -> [(Int, String)] 的函数。因此aux 1 是来自[String] -> [(Int, String)] 的函数。这与您的 enumerate 函数具有相同的签名。因此,enumerate list = aux 1 list 可以通过消除list 参数写成enumerate = aux 1

标签: haskell recursion


【解决方案1】:

不要害怕写一个支持函数,其实把它看成是机会:为什么任意的起始值是1?为什么没有函数

>enumerateFrom 42 ["banana", "potato", "ice"]
[(42, "banana"), (43, "potato"), (44, "ice")]

一旦你有了它,enumerate 就很容易了。

编辑: 要么给你的aux 函数一个真实的名字,恕我直言enumerateFrom 很好,或者如果你已经知道的话,把它移到where 子句中。并且听chi,使用x : ...而不是[x] ++ ...

【讨论】:

  • 尽可能检查一下并给我您的反馈。
【解决方案2】:

正如您所说,您想实现自己的 zip:

zip' [] _ = []
zip' _ [] = []
zip' (x:xs) (y:ys) = (x,y) : zip' xs ys

【讨论】:

  • 迟了几秒 :)
【解决方案3】:

已经有一个称为zip (zip :: [a] -> [b] -> [(a,b)]) 的函数。现在对于您的函数,您只需传递一个带有1,2,... 作为第一个参数的列表并获得您的结果,例如

enumerate :: [String] -> [(Int, String)]
enumerate = zip [1..]

编辑:

如果您还想实现自己的zip 函数,只需使用:

zip' :: [a] -> [b] -> [(a,b)]
zip' _ [] = []
zip' [] _ = []
zip' (x:xs) (y:ys) = (x,y):zip' xs ys

您获取两个列表([a][b])并将每个元素放入一个元组中。当列表之一为空时,边缘情况属于核心,您返回一个空列表。否则,您使用模式匹配来获取列表的第一个元素,将它们放入一个元组中,然后使用列表的尾部再次调用zip'

【讨论】:

  • 我知道。但我想实施一个......只是为了学习。你能举手吗?
  • @PlayHardGoPro 所以你的意思是你想实现你自己的zip函数?
  • 是的...我想提高我对递归的了解。猜猜这是一条路要走。我应该首先告诉你,对不起。我会更新问题
  • 好人!但是如果我不想改变我的功能结构怎么办。我的意思是,继续只使用字符串函数。那么唯一的解决方案将是一个支持函数,对吧?
  • @PlayHardGoPro 是的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2015-09-21
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多