私はいくつかのf#パーサーといくつかのストリーミングソフトウェアを使っています。より多くのパターン。私はそれが配列の自然な代替物であることがわかり、いくつかの自然な利点があります。 は、この型を使用する関数の例です。 「パワーパック」にあった。これは、LazyList
ように聞こえる私はそれが名前を持っている場合ので、私はそれこのパターンの名前はありますか?a型式a a foldedSequence = Empty | 'a *(unit - > a foldedSequence)'の値
答えて
既存の回答に追加するには、私はハスケラーはこれの一般化されたバージョンを呼び出すかもしれないこのa list monad transformer。その考え方は、あなたの型定義は通常のF#list
のように見えますが、それにはいくつかの追加の側面があります。
type ListTransformer<'T> =
| Empty
| Value of 'T * M<ListTransformer<'T>>
特定M
を供給することにより、あなたは物事の数を定義することができます:あなたは、これはと書いて想像することができます
M<'T> = 'T
はあなたにM<'T> = unit -> 'T
はあなたの順序を与える通常のF#のリストタイプを与えること遅く評価することができますM<'T> = Lazy<'T>
はあなたにLazyListを与えます(既に評価された要素をキャッシュします)M<'T> = Async<'T>
はまた、この定義にLazyTransformer<'T>
が遅れ/怠惰/非同期値そのものではないことは注目に値する
あなたにasynchronous sequencesを与えます。これは、場合によっては問題を引き起こす可能性があります。あなたは、ストリームが空であるかどうかを決定するためにいくつかの非同期操作を実行する必要がある場合 - ので、より良い定義は次のとおりです。
type ListTransformer<'T> = M<ListTransformerInner<'T>>
and ListTransformerInner<'T> =
| Empty
| Value of 'T * ListTransformer<'T>
ありがとう!これはまさに私が後にしたものでした。私はまだ機能型システムの新しさと私は継続的な値を包むために一般的なモノイドを使用することを考えたことはありません。 –
@ThomasDevriesハッピーこれが助け! F#ではこれを一般的に行うことはできません。これは、別のパラメータ化された型で型をパラメータ化する方法がないためです(これはMを使って一般化します)。しかし、これはまだ一般的な設計パターンとしては便利です。これをデザインパターンと見なすことで、あなたが念頭に置いている特定のユースケースに対してうまく設計することが難しくなります)。 –
のためにいくつかのヒントやトリックを研究することができます知っていただきたいと思い非常に参考にされています
type foldedSequence<'a> =
| Empty
| Value of ' a * (unit -> 'a foldedSequence)
let rec createFoldedSequence fn state =
match fn state with
| None -> Empty
| Some(value, nextState) ->
Value(value, (fun() -> unfold fn nextState))
let rec filter predicate =
function
| Empty -> Empty
| Value(value, nextValue) ->
let next() = filter predicate(nextValue())
if predicate value then Value(value, next)
else next()
let toSeq<'t> =
Seq.unfold<'t foldedSequence, 't>(function
| Empty -> None
| Value(value, nextValue) -> Some(value, nextValue()))
と
http://fsprojects.github.io/FSharpx.Collections/reference/fsharpx-collections-lazylist-1.html
https://github.com/fsprojects/FSharpx.Collections/blob/master/src/FSharpx.Collections/LazyList.fs
あなたのタイプはどのように近いです:私は今ここに住んでいると思いますiterateeが定義され、すでにストリーミングについて言及しているので、これはあなたが探しているコンセプトかもしれません。
Iteratee IOは、Oleg Kiselyovで概説された遅延IOへのアプローチです。ハスケルとは別に、F#(FSharpx.Extrasの一部として)を含む主要な関数言語の実装が存在します。
これはFSharpxはIteratee
を定義する方法である:
type Iteratee<'Chunk,'T> =
| Done of 'T * Stream<'Chunk>
| Error of exn
| Continue of (Stream<'Chunk> -> Iteratee<'Chunk,'T>)
は、このブログの記事も参照してください:Iteratee in F# - part 1。注意してください2分であるように注意してください。
- 1. タイプパターンの名前:R a b = Q(a - >(R a b、b))
- 2. この関数の型(a - > a) - > aはなぜですか?
- 3. Haskell - A型のすべての関数 - > A - > ... - > A
- 4. A aとの間に違いはありますか? A a = A()?
- 5. OCAML:let func a x =(a x);;の違いfunc a x =((fun a - > a)x);;
- 6. A [n-1]> = A [n] <= A [n + 1]
- 7. auto a = A(3)とA a(3)の違いは何ですか?
- 8. どうすればpreg_replace @<a> @</a>〜<a> @</a>?
- 9. C++では、A + = BがA = A + Bよりも好都合です。++ AはA ++になりますか?
- 10. SonarQubeはa == aの代わりにa == aを提案します
- 11. C#unit testing a class
- 12. Haskell Vector Typeclass:[a] - > [a] - > aの関数
- 13. 導出キューブ(a)は(a)の<-> =(フィッチ)
- 14. 標準MLの(a - >( 'b - >' c)) - >( 'a - >' b) - >( 'a - >' c)の関数
- 15. コーディングテストJava配列S = A [A [A [A]]]]?
- 16. boost spirit x3(A | A)の属性タイプは、Aの代わりに<A, ?>です
- 17. a = b + aのショートカット。
- 18. coq私は何のために使うべきですか?A:Prop、A - >〜A A
- 19. は<a>
- 20. MonadRandom m => [g(m a)] - > m [g a]
- 21. href式<a href="javascript:;"></a>の機能は何ですか?
- 22. a、&a、* aの違いは何ですか?
- 23. Aとの違いは何ですか? A a();
- 24. 誰かが結果を証明する方法を知っています 'a^b%m =(...((a%m)* a)%m)...... * a)%m'</p> <pre><code>'a^b % m = (...((a % m) * a) % m) ......* a) % m' </code></pre> <p>:
- 25. a + bとchar型の値
- 26. int&aとint&aに違いはありますか?
- 27. Functorは(a - > b) - >(f a - > f b)であり、(cカテゴリ)=> c a b - > c(f a)(f b)とは何か?
- 28. Matlabスクリプトa(n)= a(n-1)+ a(n-2)
- 29. Haskell Error:制約の非可変引数です。Num(a - > a - > a)
- 30. numel(isnan(A))== numel(〜isnan(A))== numel(A)?
FWIW、「predecate」おそらく「述語」である必要があります。)について、あなたは求めているタイプ –
、問題の本文の中のタイトルのものかもう一つのものか?その最後のストリームは空であるストリーム、または現在の値を保持するペアと次のストリームを生成する関数です。 –
申し訳ありませんヘッダーでミスタイプしました。ストリームについて質問しています。 'type foldedSequence <'a> = Empty | 'a *(unit - >' a foldedSequence) 'の値 –