Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    Matsushima, Kazuhiro
    @Gab-km
    とましゅぴの興奮っぷり
    Matsushima, Kazuhiro
    @Gab-km
    そういえば、先ほどの文字列→配列であまり採用しない方がいい方法を思いついたんで共有します。
    let parseStrToArray str =
      let rec parseRec str acc =
        match String.length str with
        | 0 -> acc
        | _ -> parseRec (str.[1..]) (str.[0] :: acc)
      parseRec str [] |> List.rev |> List.toArray
    pocketberserker
    @pocketberserker
    しかしFsUnitを新規で書かないマンとしては嬉しさがない…数年前にほしかった><
    callmekohei
    @callmekohei
    が、ガブさん。すごい!すごい!ありがとうございます!(^_^)/
    callmekohei
    @callmekohei
    な、何度もすみません。下記コードでいい案ありませんでしょうか?ヒントあればよろしくお願いします。
        [<EntryPoint>]
        let main (args: string[]) =
    
            let str = "abc"
            let bit = "110"
    
            Seq.zip str bit |> printfn "%A"
            // seq [('a', '1'); ('b', '1'); ('c', '0')]
    
            Seq.zip str bit
            |> Seq.map ( fun tpl ->
                match snd tpl with
                | '1' -> printfn "%A" tpl
                | _   -> printfn "%A" ('z') ) 
            // ★ seq [('a','b')] としたい!
    
            0
    callmekohei
    @callmekohei
    い、一応ここまではできます。。。本当にすみません。。。
        [<EntryPoint>]
        let main (args: string[]) =
    
            let str = "abc"
            let bit = "110"
    
            Seq.zip str bit
            |> Seq.filter ( fun tpl -> snd tpl = '1')
            |> printfn "%A"
            // seq [('a', '1'); ('b', '1')]
    
            0
    Yukitoshi Suzuki
    @yukitos
    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
    とか。
    Yukitoshi Suzuki
    @yukitos
    let result2 =
        Seq.zip str bit
        |> Seq.filter (fun (s, b) -> b = '1')
        |> Seq.map fst
    printfn "%A" result2
    とか。
    pocketberserker
    @pocketberserker
    型を残しつつタプルにする方法が思いつかないので厳しみを感じる…
    callmekohei
    @callmekohei
    ユキトスさん!ありがとうございます!これをもとにさらに組み合わせやってみます!(^_^)/
    callmekohei
    @callmekohei

    <argにリストを渡す>

    しつこすぎてすみません。おてすきのときに。。
    下記のコードにリスト[1;2;3]を渡したいのですが文字列しか渡せません。渡し方もしあれば教えていただくと助かります。
    [<EntryPoint>]
    let rec main (args: string[]) =
        printfn "%A" args.[0]
        0
    Yukitoshi Suzuki
    @yukitos
    program.exe 1 2 3
    と実行された時に自分で[1;2;3]にするしかないんじゃないですかね
    PowerShellでもないかぎりプログラムは引数に文字列の配列しか受け取れないですね
    callmekohei
    @callmekohei
    なるほどです!ありがとうございます(^_^)/
    Yukitoshi Suzuki
    @yukitos
    1 a 3が引数に渡されたらどうすべきか、とか実際には色々考えないといけないことがありますね;)
    callmekohei
    @callmekohei
    了解です!(^_^)/
    callmekohei
    @callmekohei

    <カリー?されてる関数について>

    下記コードの後半部分がもうすこし簡潔に書けそうな気がしてます。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"]]
    Yukitoshi Suzuki
    @yukitos
    もうちょっと入出力の情報も添えてもらわないとコードから察してくださいっていうのは厳しいですよ。。。
    callmekohei
    @callmekohei
    す、すみません。
    Yukitoshi Suzuki
    @yukitos
    局所的に簡潔になる方法を出すのは出せますけど、何がやりたいのかをはっきりさせたほうがヘルプもしやすいです:)
    callmekohei
    @callmekohei
    了解です!(^_^)/
    Yukitoshi Suzuki
    @yukitos
            bit
            |> List.map f
            |> Seq.map Seq.toList
            |> Seq.toList
            |> printfn "%A"
    入力をそのまま使うならこれでいける、のかな(動作確認してません;)
    callmekohei
    @callmekohei
    ユキトスさん!ありがとうございます!バッチリです!外部にlet f = mapping lstとでてたのがイマイチな感じだったのです!
    Yukitoshi Suzuki
    @yukitos
    |> List.map (mapping lst) にしたってことですかね
    callmekohei
    @callmekohei
    ですです(^_^)/
    Yukitoshi Suzuki
    @yukitos
    なるほど
    omanuke
    @omanuke
    bit
    |> List.map (mapping lst>>List.ofSeq)
    |> printfn "%A"
    でよいのでわ
    Yukitoshi Suzuki
    @yukitos
    :+1:
    callmekohei
    @callmekohei
    omanukeさん、すごい(≧∇≦)
    callmekohei
    @callmekohei

    <階乗進法 factorial number system をコンピュテーション式で表現することに関して>

    毎日毎日申し訳ありません。お手すきの時にでも。。。
    順列を求めたくて、階乗進法が必要になりました。
    .

    課題

    たとえば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 が直感ですが再帰っぽい感じがします。つまりなにかしら
    桁数がふえても同じ式で対応できるのではないかと考えました。

    なにかしらヒントを頂けると嬉しいです。

    adacola
    @adacola
    階乗進法って一種の位取りなので、お察しの通りループや再帰を使って一般化できます。
    階乗進法の作り方を調べてみるのがいいと思います。
    omanuke
    @omanuke
    コンピュテーション式はある枠組みの中にそって自由に記述できるものだと思うのですが、その階乗計算だと自由に記述する必要性あるんです?
    adacola
    @adacola
    コンピュテーション式を使うと嬉しい場面ではないような…(もちろん使うこと自体はできるでしょうけど)
    少なくとも自分が思いついた実装ではコンピュテーション式は出てこないです
    callmekohei
    @callmekohei

    omanukeさん、アダコーラさん。おはようございます!

    ううう、コンピュテーション式はなんか筋が悪そうな感じかも、、、ですね(^_^;; ループバージョンはできてるのでひとまず再帰バージョンを書いてみます。ただ、コンピュテーション式も興味はある、、、みたいな感じです。

    bleis-tift
    @bleis-tift
    ここでコンピュテーション式を説明したドキュメントを見てみましょう!
    F# のコンピュテーション式には、制御フローの構成要素と束縛を使用してシーケンス化および結合できる計算を記述するための便利な構文が用意されています。これらの計算式を使用すると、モナドの便利な構文が提供されます。モナドとは、関数型プログラムのデータ、制御、および副作用の管理に使用できる関数型プログラミングの機能です。
    最初の文からして意味不明です!

    原文は、

    Computation expressions in F# provide a convenient syntax for writing computations that can be sequenced and combined using control flow constructs and bindings.

    と、これまた何言ってるんだ感のある説明・・・
    コンピュテーション式つらい・・・
    訳してみた:
    F#のコンピュテーション式は、
    制御フローの構成要素や束縛を使って、
    並べたり組み合わせたりできる計算を書くための便利な構文を提供します。
    「並べたり組み合わせたりできる計算」を制御フローの構成要素(ifとかwhileとかそういうのとか、returnとか?)や束縛(let!てきな)を使って便利に書けるよ、ということが言いたいのだと推測
    bleis-tift
    @bleis-tift
    「並べたり組み合わせたりできる計算」ってなんぞや、に対する説明が吹っ飛んでるけど、これの一例が後ろの分で出てくる「モナド」ですね
    callmekohei
    @callmekohei
    ふむふむ、です(≧∇≦)なにか、コンピュテーション式でできそうですね!
    bleis-tift
    @bleis-tift
    階乗進法を実装するには、「並べたり組み合わせたりできる計算」は見つからないと思いますよー
    コンピュテーション式は、計算の実装ではなく、計算の枠組みを提供するものなので、計算の実装のために使っても意味ないというか、本来の使い方じゃないです