【发布时间】: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。