let str = "abcdefg"
let bit = "1110010"
let rec tostr (acc: char list) (strs: char list) (bits: char list) =
match bits with
| [] -> acc
| '1' :: bx -> strs.[0] :: (tostr acc (List.tail strs) (List.tail bits))
| '0' :: bx -> tostr acc (List.tail strs) (List.tail bits)
| x -> failwith ("unexpected value: " + x.ToString())
let result = tostr [] (List.ofSeq(str)) (List.ofSeq(bit))
printfn "%A" result
とか。
lst bit
を先頭に流し込めそうな気がするのですが、、、お手すきの時にヒント頂けると嬉しいです。module mapping =
[<EntryPoint>]
let main (args:string[]) =
let lst = ["A"; "B"; "C"]
let bit = ["110"; "101"; "011"]
let mapping lst bit =
(lst, bit)
||> Seq.zip
|> Seq.filter (fun (s, b) -> b = '1')
|> Seq.map fst
// ★ここの部分がもっと簡潔にかける気がするのですが。。。
//--------------------------
let f = mapping lst
bit
|> List.map (fun n -> f n)
|> Seq.map ( fun elm -> Seq.toList elm )
|> Seq.toList
|> printfn "%A"
//--------------------------
0
// 結果
// [["A"; "B"]; ["A"; "C"]; ["B"; "C"]]
毎日毎日申し訳ありません。お手すきの時にでも。。。
順列を求めたくて、階乗進法が必要になりました。
.
たとえば2桁の場合、下記のリストが欲しいです。
N = 2 のとき
[[0; 0];[0; 1];[1; 0];[1; 1];[2; 0];[2; 1]]
下記コードにて実装しました。
module test00 =
type myBuilder () =
member this.Bind (xs, f) = xs |> List.collect f
member this.Return x = [x]
let myBld = myBuilder()
let N = 2
let lst n =
myBld { let! x = [ 0..n ]
let! y = [ 0..(n-1) ]
return [x; y] }
for v in (lst N) do
printfn "%A" v
上記を実行すると
[0; 0]
[0; 1]
[1; 0]
[1; 1]
[2; 0]
[2; 1]
ここで一つ問題が。。。桁を増やすとmyBld
のところのコードを増やさないといけないです。たとえば3桁のばあいはmdBld
は下記になります。
let lst n =
myBld { let! x = [ 0..n ]
let! y = [ 0..(n-1) ]
let! z = [ 0..(n-2) ]
return [x; y; z] }
.
.
この myBld が直感ですが再帰っぽい感じがします。つまりなにかしら
桁数がふえても同じ式で対応できるのではないかと考えました。
なにかしらヒントを頂けると嬉しいです。
F# のコンピュテーション式には、制御フローの構成要素と束縛を使用してシーケンス化および結合できる計算を記述するための便利な構文が用意されています。これらの計算式を使用すると、モナドの便利な構文が提供されます。モナドとは、関数型プログラムのデータ、制御、および副作用の管理に使用できる関数型プログラミングの機能です。
原文は、
Computation expressions in F# provide a convenient syntax for writing computations that can be sequenced and combined using control flow constructs and bindings.