2011-10-27 115 views
4

我想学习如何用函数式编程思考,为此,我试图学习Erlang并从编码中解决简单的问题。我遇到了比较列表中元素的常见问题。例如,比较第i个位置元素的值与列表的第i + 1个位置的值。所以,我一直在思考和探索如何在Erlang(或任何函数式语言)中以功能的方式进行此操作。在Erlang中比较数组元素

请,温柔和我在一起,我在这个世界上功能非常福利局,但我想学

在此先感谢

回答

4

定义列表:

L = [1,2,3,4,4,5,6] 

定义函数f,需要一个列表

  • 如果它匹配一个元素或一个空列表的列表,则返回空lis t
  • 如果它匹配第一个元素和第二个元素,则取第一个元素并通过调用剩余列表递归构造一个新列表
  • 否则跳过列表的第一个元素。

在二郎山代码

f ([]) -> []; 
f ([_]) -> []; 
f ([X, X|Rest]) -> [X | f(Rest)]; 
f ([_|Rest]) -> f(Rest). 

应用功能

f(L) 

这应该工作......没有编译和运行它,但它应该让你开始。此外,如果您需要对其进行修改以改变其行为方式。

欢迎来到二郎山;)

+0

非常感谢你 – Cheluis

1

我尽量温柔;-)功能性的方法,使主要的是想在术语:输入是什么?应该输出什么?没有什么比较单独的第i个元素与第i + 1个元素。必须始终具有导致数据转换的目的。即使是Mazen Harake也是这样做的。在这个例子中有一个函数,它只返回后面跟着相同值的元素,即过滤器给定列表。通常有非常不同的方式如何做类似的事情,这取决于它的目的。 List是基本的功能结构,你可以用Lisp给我们做很棒的事情,但是你必须记住它不是数组。

每次您需要访问第i个元素可重复时,它表示您使用错误的数据结构。您可以在Erlang中构建不同的数据结构形式列表和元组,这可以更好地满足您的需求。所以当你面对问题来比较第i个元素和第i + 1个元素时,你应该停下来思考。它的目的是什么?你需要执行一些数据转换为Mazen Harake吗?或者你需要随机访问?如果其次你应该使用不同的数据结构(例如array)。即使那样你也应该考虑你的任务特征。如果您将大部分阅读并且几乎从不写,那么您可以使用list_to_tuple(L),然后使用element/2进行阅读。当你偶尔需要编写代码时,你会开始考虑将它分割成几个元组,并且随着写入比率的增加,你将最终实现array

所以,你可以使用lists:nth/2如果你会做或几次,但名单上只有一次,你是不是反常表现作为我。您可以使用[X1,X2|_] = lists:nthtail(I-1, L)L = lists:nthtail(0,L)按预期工作)对其进行改进。如果你面对更大的名单,并且你想多次打电话,你必须重新考虑你的方法。

P.S:有,除了列表和树上有很多其他有趣的数据结构。例如拉链。