我正在尝试学习如何以函数式编程方式思考,为此,我正在尝试学习Erlang并解决来自codingbat的简单问题。我遇到了比较列表中元素的常见问题。例如,将第i个位置元素的值与列表的第i + 1个位置的值进行比较。所以,我一直在思考和搜索如何在Erlang(或任何函数语言)中以功能的方式执行此操作。
拜托,对我温柔,我在这个功能性的世界里非常陌生,但我想学习
提前致谢
答案 0 :(得分:4)
定义一个列表:
L = [1,2,3,4,4,5,6]
定义一个函数f,它取一个列表
在Erlang代码中
f ([]) -> [];
f ([_]) -> [];
f ([X, X|Rest]) -> [X | f(Rest)];
f ([_|Rest]) -> f(Rest).
应用功能
f(L)
这应该工作......没有编译并运行它但它应该让你开始。此外,如果您需要对其进行修改以表现不同。
欢迎来到Erlang;)
答案 1 :(得分:1)
我试着保持温柔;-)所以功能性方法的主要内容是用术语思考:什么是输入?应该输出什么?没有什么比仅仅将第i个元素与第i + 1个元素进行比较。必须始终有它的目的,这将导致数据转换。甚至是Mazen Harake的例子。在这个例子中,有一个函数只返回后跟相同值的元素,即给定列表的过滤器。通常有很多不同的方式,如何做类似的事情取决于它的目的。列表是基本的功能结构,你可以用它做一些惊人的事情,因为Lisp告诉我们,但你必须记住它不是数组。
每当您需要访问第i个元素可重复时,它表示您使用了错误的数据结构。您可以在Erlang中构建表单和元组的不同数据结构,以便更好地满足您的需求。因此,当你面临将i-th与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。:除了列表和树之外,还有许多其他引人入胜的数据结构。例如拉链。