2016-12-29 9 views
6

Haskellには、無限の長さの配列で作業するのが効率的だと気づいた。無限の長さの配列

速いプログラマであるので、私は迅速にこれを達成する方法について興味がありますか?例えば

var infiniteArray = [1,2,3,.............] 
+5

あなたはHaskellの長さが無限の配列を持っていますが、それはどういう意味ですか?あなたが探しているものを正確に定義してください。そうしないと、質問の解釈が間違っている可能性があります。 – ColGraff

答えて

9

スウィフトのArrayは、コンクリートで熱心に評価された要素を格納するので、(有限のメモリのために)無限になることはできません。

スウィフト同等物は無限Sequenceです。ここでは無限の自然数列を生成する例を示します。

let naturalNumbers = sequence(first: 0, next: { $0 + 1 }) 
let first5NaturalNumbers = Array(naturalNumbers.prefix(5)) 

print(first5NaturalNumbers) 

それは無限に長い、怠惰な評価をシーケンスである、UnfoldSequenceを生成するためにsequence(first:next:)機能を使用しています。

+2

*コレクション*は開始インデックス、終了インデックス、したがって有限長を持っています。 –

+0

@MartinRフェアポイント! – Alexander

+0

は5000000番を試しました。かなりの時間がかかりました。 –

5

Haskellのそれは完全に機能する言語であるため、(など、副作用を持たない)遅延評価を持っている、それはいくつかの機能を借りるのにスウィフトは(関数型言語ではなく、機能性や構文)、同じ機能を持っていません。

SequenceGeneratorを使用して、無限リストの印象を作成することができます。たとえば、http://blog.scottlogic.com/2014/06/26/swift-sequences.htmlを参照してください。もちろん、リストは本当に無限ではありません - ハスケルのリストも無限ではないので、新しい項目を作成する関数を保存するだけです。

主な違いは、変数と副作用がないため、Haskellではいくつかの主要なパフォーマンスの最適化が可能であることです。スウィフトではそれをすることはできません。だから、HaskellのコードをSwiftに翻訳することに注意してください。

+0

スウィフトは純粋に機能的な言語ではありませんが、実際には最適化とほとんど妥協のない多くの機能的パラダイムに従うことができます。ハスケルにそれらがあり、スウィフトにそれらが欠けていると言うとき、あなたはどのような最適化を指していますか? Swiftは、Haskellと同様に、新しいエントリを作成する関数を格納できます。 – ColGraff

+0

@ColGraffたとえば、同じメソッドの複数の呼び出しでは、同じ保証出力が得られます。これにより、Haskellは各式を1回だけ評価し、呼び出しが発生するあらゆる場所で戻り値を使用することができます。これはSwiftでは不可能です。 'a()+ a()'はハスケルが 'a'を一度評価し、両方の呼び出しを戻り値に置き換えるため、Swiftは実際に' a'を2回呼び出す必要があります。 – luk2302

+0

@ColGraffこれは、フィボナッチ数の生成のような計算において幾らかの指数関数的な成長を含む高価なメソッドコールにとって特に重要です。 – luk2302

2

あなたの意図は、関数にパラメータの数が不明な渡す場合は(論理的な観点から、あなたがあるため、マシンのメモリの制限の「パラメータの無限の数を」と言うことはできませんが)、それが呼ばれていますvariadic parameter

variadicパラメータは、指定された型の0個以上の値を受け入れます。 variadicパラメーターを使用して、関数が呼び出されたときにパラメーター にさまざまな入力値が渡されることを指定します。 パラメータのタイプ名の後に3つのピリオド(...) を挿入して可変パラメータを記述します。

例えば

、あなたがそれらを合計するintの未知の数を取る関数を実装したいとしましょう:

func summationOfInfiniteInts(ints: Int...) -> Int { 
    return ints.reduce(0, +) 
} 

let summation = summationOfInfiniteInts(ints: 1, 2, 3, 4) // 10 

なおの[Int](配列として表さsummationOfInfiniteIntsのブロックでintsパラメータInt)。

これが役に立った。

+0

私はこれを、可変長argsのキーワードを使ってすばやく素敵なものに検索していました。 – vaibhav

+0

@vaibhav詳細については、[documentation](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html)をチェックすることをお勧めします。* Variadic Parameters *セクション –

+0

はい、あなたは正しいです。しかし、これは関数パラメーターのみに有効です。 –