F# でさまざまな式を単純化することについて、いくつか質問を始めたいと思います。
誰でも、insertAt のより優れた、および/またはより単純な実装のアイデアを持っています (パラメーターも並べ替えることができます)。リストまたはシーケンスを使用できます。
ここにいくつかの開始実装があります:
let insertAt x xs n = Seq.concat [Seq.take n xs; seq [x]; Seq.skip n xs]
F# でさまざまな式を単純化することについて、いくつか質問を始めたいと思います。
誰でも、insertAt のより優れた、および/またはより単純な実装のアイデアを持っています (パラメーターも並べ替えることができます)。リストまたはシーケンスを使用できます。
ここにいくつかの開始実装があります:
let insertAt x xs n = Seq.concat [Seq.take n xs; seq [x]; Seq.skip n xs]
Seq を使用した末尾再帰:
let rec insertAt = function
| 0, x, xs -> seq { yield x; yield! xs }
| n, x, xs -> seq { yield Seq.hd xs; yield! insertAt (n-1, x, Seq.skip 1 xs) }
Haskellリスト挿入のF#実装は次のとおりです。
let rec insertAt x ys n =
match n, ys with
| 1, _
| _, [] -> x::ys
| _, y::ys -> y::insertAt x ys (n-1)
let a = [1 .. 5]
let b = insertAt 0 a 3
let c = insertAt 0 [] 3
>
val a : int list = [1; 2; 3; 4; 5]
val b : int list = [1; 2; 0; 3; 4; 5]
val c : int list = [0]
私のHaskellは、空のリストを渡す場合がHaskell関数で正しく処理されているかどうかを知るのに十分ではありません。F#では、2番目の一致ケースで空のリストを明示的に処理します。
ダニー
HaskellWikiから-http ://www.haskell.org/haskellwiki/99_questions/21_to_28
insertAt :: a -> [a] -> Int -> [a]
insertAt x ys 1 = x:ys
insertAt x (y:ys) n = y:insertAt x ys (n-1)
私はF#プログラマーではないので、F#と同等の構文はわかりませんが、これはinsertAtの優れた再帰的定義です。