2016-09-17 9 views
1

私はこのようにそれを呼び出したときに正常に動作し、簡単なStream.unfold機能を、書かれている:私は自分自身のストリーム関数をElixirに書くことはできますか?

a = Stream.unfold({1,2,3}, &my_unfold_func) |> Stream.take(5) 

しかし、私は私ができるようになるラッパーを実装する方法を見つけることができていないようです私の関数を直接呼び出すこのように:私が試した何

a = my_unfold_wrapper() |> Stream.take(5) 

は次のとおりです。

#Stream<[enum: #Function<35.27730995/2 in Stream.unfold/2>, 
funs: [#Function<38.27730995/1 in Stream.take/2>]]> 
[Finished in 0.7s] 

問題が流れていることのようだ:

def my_unfold_wrapper(), do: Stream.unfold({1,2,3}, &my_unfold_func) 

私はこのコードを実行すると、私はエラーを取得します.take()は配列に変換するために何らかの形で実行する必要のある別のストリームを返しています。 Stream.takeをEnum.takeに置き換えることは、ストリームをどのように実行できるかという疑問を残すトリックを行うように思えます。

+1

これはうまく見えますが、これをデバッグするにはさらに詳しい情報が必要です。取得している特定のエラーメッセージは何ですか? 'my_unfold_func'の定義を教えてください。 –

+0

'new'コードを実行すると出力が次のようになります:#Stream <[enum:#Function <35.27730995/2 in Stream.unfold/2>、 funs:[#Function <38.27730995/1 in Stream.take/2>]]> [0.7sで終了]問題は、Stream.take()が配列に変換するために何らかの形で実行する必要がある別のストリームを返すということです。 Stream.takeをEnum.takeに置き換えることは、ストリームをどのように実行できるかという疑問を残すトリックを行うように思えます。また、どのように私はSOのコメントに新しい行を挿入できますか?すなわち、コメントを終わらせることなく? – Andy

+1

質問を編集して、そのコメントに記入したエラー情報を含めてください。 –

答えて

1

私はそれをひっくり返したと思います。フォローコードは、私が欲しいものほとんどありません: - 私は別のSOの質問に提起した問題を

Foobar.my_unfold_wrapper() 
|> Stream.take(10) 
|> Stream.into(File.stream!("output.txt", [:write, :utf8])) 
|> Stream.run 

私は今、これを持っている唯一の問題は、出力は1つの巨大なラインに連結されていることです。

+0

これはストリームを実行する正しい方法です。ストリーム値も同様にしたい場合は、 'Stream.run/1'の代わりに' Enum.to_list/1'でリストを取得できます。しかし、 'Stream.run'ファイルへの書き込みは正しい選択です。行を流す/改行をファイルに追加するには、 ':line'オプションを追加する必要があります。 –

+0

File.stream!にラインオプションを追加するにはどうすればいいですか?コール?私はそれをwriteなどで入れてみましたが、別のオプションリストの前後に別々の引数としても入れましたが、これらのアプローチのどれも動作しません。 – Andy

+0

|> Stream.into(File.stream!( "output.txt"、[]、:line))を使ってコンパイルすると、 でも影響はないようです。 map関数を使用して、各出力行の最後に新しい行を追加します。 – Andy

関連する問題