2017-09-26 12 views
2

私はエリクシールには新しく、ギタータブの問題を解決しようとしています。 マイコード:匿名関数の中で名前付き関数変数を更新するエリクシル

def sumTabs([head|tail], result) do 
     nextLine = hd(tail) 
     tail = List.delete(tail, nextLine) 
     head 
     |> Enum.with_index 
     |> Enum.each(fn({x, i}) -> 
      s = [x <> Enum.at(nextLine, i) |> to_charlist] 
      IO.inspect s 
      result = [result | s] 
      IO.inspect result end) 
     result 
    end 

私は開始時に空のリストですが、Enum.each機能の各反復では、結果が空の結果を、更新したいです。私はそれが匿名の機能のためだと思う。

私はそれが少なくとも2行で動作するようにしたいと思います。

入力:

tab = """ 
    e|-7-----7-----7-----7-----5-----3-----3-----2-----0-----0-----| 
    B|---0-----0-----0-----0-----0-----0-----0-----0-----0-----0---| 
    G|-----0-----0-----0-----0-----0-----0-----0-----0-----0-----0-| 
    D|-------------------------------------------------------------| 
    A|-------------------------------------------------------------| 
    E|-------------------------------------------------------------| 
    """ 

出力:sumTabs機能前

['eB'] 
[[], 'eB'] 
['||'] 
[[], '||'] 
['--'] 
[[], '--'] 
['7-'] 
[[], '7-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['7-'] 
[[], '7-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['7-'] 
[[], '7-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['7-'] 
[[], '7-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['5-'] 
[[], '5-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['3-'] 
[[], '3-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['3-'] 
[[], '3-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['2-'] 
[[], '2-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['0-'] 
[[], '0-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['0-'] 
[[], '0-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['||'] 
[[], '||'] 

コード:エリクシールで

defmodule TabPlayer do 
    def parse(tab) do 
     String.split(tab, "\n") 
      |> Enum.map(fn n -> to_string n end) 
      |> List.delete([]) 
      |> Enum.map(fn n -> String.graphemes n end) 
      |> sumTabs([]) 
      |> IO.inspect 
    end 

答えて

4

変数は不変です。 Enum.eachの中の値を再割り当てすることはできず、外部で変更することはできません。このコードが行うことは、新しいresult値を作成し、無名関数が終了するまで続きます。

ここでEnum.reduce/3を使用して、すべての繰り返しで新しいresult値を返すことができます。残りのロジックが正しいと仮定して、Enum.reduce/3を使用するようにコードを書き直す方法は次のとおりです。私は、IO.inspectが値を出力してからそれを返すという事実を利用しています。従ってIO.inspect(x); xIO.inspect(x)と同じです。

def sumTabs([head|tail], result) do 
    nextLine = hd(tail) 
    tail = List.delete(tail, nextLine) 
    head 
    |> Enum.with_index 
    |> Enum.reduce([], fn({x, i}, acc) -> 
    s = IO.inspect [x <> Enum.at(nextLine, i) |> to_charlist] 
    IO.inspect [s | acc] 
    end) 
    # We need to reverse at the end since we're creating a reversed list in 
    # `Enum.reduce` for efficiency. 
    |> Enum.reverse 
end 
+0

これはうれしいです、ありがとうございます!しかし、次の関数呼び出しのためにそれを与えるために "acc"変数を得るにはどうしたらいいですか? – Projectionist

+0

'result = head |> ...'のように最終的な値を格納し、それを使用することができます。 'Enum.reduce'は' acc'の最終値を返します。それはあなたが意味することですか? – Dogbert

+0

はい、完璧です、ありがとう! – Projectionist

関連する問題