如何在Enum.map中调用匿名函数

时间:2016-06-17 19:11:28

标签: functional-programming elixir

我正在学习Elixir,我正在研究Project Euler,试图加强我在Elixir的技能。现在我有这个代码

df = pd.DataFrame(np.random.choice(list('ABCDE'), 100), columns=['strings'])
df.head()

  strings
0       B
1       A
2       B
3       E
4       D
5       C
6       E
7       D
8       D
9       D

test_string = 'A'
df.loc[df[df['strings'].str.contains(test_string)].index.union(df[df['strings'].str.contains(test_string).shift().fillna(False)].index)] 

但是当我运行这段代码时,我得到了:

   strings
1        A
2        B
11       A
12       A
13       D
18       A
19       C
36       A
37       C
42       A
43       E
44       A
45       C
51       A
52       B
56       A
57       A
58       A
59       C
62       A
63       D
69       A
70       E
73       A
74       E
96       A
97       A
98       B

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:7)

Elixir目前不允许定义匿名递归函数。你有两个选择:在任何模块中使用[opcache.revalidate_freq] => 60定义一个普通函数,或者使用下面的技巧(hack?)来制作一种匿名递归函数:

def

我建议在模块中定义此函数,而不是使用此hack:

fib = fn
  fib, a, b, 0 -> a
  fib, a, b, n -> fib.(fib, b, a+b, n-1)
end

IO.puts Enum.sum(Enum.filter(Enum.map(1..50, fn n -> fib.(fib, 0, 1, n) end), fn(x) -> rem(x, 2) == 0 && x < 4000000 end))

注意:defmodule Fib do def fib(a, _b, 0), do: a def fib(a, b, n), do: fib(b, a + b, n - 1) end IO.puts Enum.sum(Enum.filter(Enum.map(1..50, fn n -> Fib.fib(0, 1, n) end), fn(x) -> rem(x, 2) == 0 && x < 4000000 end)) 的第二个参数中也存在语法错误,我已修复(希望正确)。

提示:请阅读有关管道运算符的内容,以使Enum.filter/2代码更加惯用:http://elixir-lang.org/getting-started/enumerables-and-streams.html#the-pipe-operator