2017-06-23 1 views
0

Ich schreibe eine Funktion, die scheint, wie es gut funktionieren sollte. Aber ich denke, ich vermisse etwas, das der Kern von Elixier ist. Hier ist, was ich versuche zu tun:Verständnis der benannten Funktionen mit Elixir

defmodule ProjectEuler do 
    def solve(limit) do 
    multiple_of_3_or_5? = fn(n) -> (rem(n, 3) == 0 || rem(n, 5) == 0) end 
    for(n <- limit, multiple_of_3_or_5?.(n), do: n) |> Enum.reduce(0, fn(x, y) -> (x + y) end) 
    end 

    def print do 
    IO.puts solve(1000) 
    end 
end 

Dies ist das erste Problem des Projekts Euler. Ich verstehe nicht, warum das keine gültige Nummer zurückgibt? Stattdessen bekomme ich diesen Fehler

** (Protocol.UndefinedError) protocol Enumerable not implemented for 1000 

Was mache ich hier falsch?

Antwort

3

Was Sie tun, ist das Äquivalent von

for n <- 1000 do 
    ... 
end 

Die Zahl 1000 nicht zählbare ist. Sie erhalten eine Range für dieses

for n <- 1..limit do 
    ... 
end 
2

Nach dem Studium der Elixir etwas verwenden wollen, kam ich mit dieser Version des ersten Projekt Euler Problem auf.

Ich denke, es ist klarer!

#!/usr/bin/env elixir 
defmodule Problem001 do 
    def solve do 
    1..999 
    |> Enum.filter(fn(x) -> rem(x, 3) == 0 || rem(x, 5) == 0 end) 
    |> Enum.sum() 
    end 
end 

IO.puts Problem001.solve 

Es iteriert einen Bereich (1..999) über, filtert die Zahlen, die von 3 oder 5 teilbar sind und summiert sie dann alle auf.

Verwandte Themen