Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    bleis-tift
    @bleis-tift
    あー、Combineも必要です
    callmekohei
    @callmekohei
    なるどです!コンピュテーション式内でいけるのですね!ちょっとやってみます!ありがとうございます!(^_^)/
    callmekohei
    @callmekohei
    うーん、先ほどのコードに足すとできるのですが、、これではないですよね(汗)
            member this.Delay f = 
                let tplsum (a, b, c) = a + b + c
                let idx = f () |> List.map ( fun tpl -> tplsum tpl )
                ( idx, f () )
                ||> List.zip 
                |> List.filter ( fun tpl -> fst tpl = 7 )
                |> List.map ( fun elm -> snd elm )
    callmekohei
    @callmekohei
    うーん、先ほどのコードに足すとできるのですが、、これではないですよね(汗)その2
            member this.Bind (x, f) = 
                let tplsum (a, b, c) = a + b + c
                let idx = ( x |> List.collect f)  |> List.map ( fun tpl -> tplsum tpl )
                ( idx, ( x |> List.collect f) )
                ||> List.zip 
                |> List.filter ( fun tpl -> fst tpl = 7 )
                |> List.map ( fun elm -> snd elm )
    callmekohei
    @callmekohei
    できました〜。let plusMinus a b c = [a; b; c]にてリストにしたらシンプルになりました!delayとか使う方法はよくわからなかったです(汗)
    module Test_ListMonad =
    
        type ListBuilder () =
            member x.Bind (l, f) = l |> List.collect f
            member x.ReturnFrom l =
                match List.sum l with
                | 7 -> [l] | _ -> []
    
        let lb = new ListBuilder()
        let lessThan n  = [1..n]
        let plusMinus a b c = [a; b; c] // <---ここが [a,b,c] tupleだったため扱いにくかった
    
        let allPMs l m n = lb {
            let! x = lessThan l
            let! y = lessThan m
            let! z = lessThan n
            return! plusMinus x y z }
    
        allPMs 6 6 6 |> printfn "%A"
    callmekohei
    @callmekohei
    今日の教訓
    [1,2,3]とするともれなくタプルで囲まれる
    [1,2,3] |> printfn "%A"
    // [(1, 2, 3)]
    
    [1;2;3] |> printfn "%A"
    // [1; 2; 3]
    bleis-tift
    @bleis-tift
    コンピュテーション式のビルダーに特殊なケースのみに使うロジックは入れるべきではありません。
    今回の場合だと、7という数字をビルダー側に書くべきではないです。
    callmekohei
    @callmekohei
    ブレイスさん!おはようございます!なるほどです!(^_^)/
    callmekohei
    @callmekohei
    なんどもすみません、、、。こんな感じでできました!
    module Test_ListMonad =
    
        type ListBuilder () =
            member x.Yield v = [v]
            member x.Bind (l, f) = l |> List.collect f
    
        let lb = new ListBuilder()
    
        let listAll =
            lb { let! x = [1..6]
                 let! y = [1..6]
                 let! z = [1..6]
                 yield [x;y;z]
                 |> fun l -> match List.sum l with 7 -> l | _ -> []
            } 
            |> List.filter ( fun l -> l <> [] ) // ここがちょっと泥臭い気が、、、
            |> printfn "%A"
    bleis-tift
    @bleis-tift
    コンピュテーション式の中でifを使って7以外を弾くといいですよ
    elseのないifを使うために、Zeroが必要です。また、その後ろに式を続ける場合はCombine(とDelayとRun)が必要です。
    bleis-tift
    @bleis-tift
    else付きのifを使ってReturnFromで空リストを返してもいいですが、コンピュテーション式側がちょっと冗長になってしまうので、定型コードはできればビルダー側に寄せたいです。
    bleis-tift
    @bleis-tift
    多分、モナドを作るところよりも先にモナドを使う方を勉強したほうがいいと思いますよ
    open FSharpPlus
    
    let listAll =
      monadPlus {
        let! x = [1..6]
        let! y = [1..(7 - x)]
        let! z = [1..(7 - x - y)]
        if x + y + z = 7 then
          return (x, y, z)
      }
    
    [<EntryPoint>]
    let main argv =
      printfn "%A" listAll
      0
    FSharpPlusというライブラリを使うとこんな感じで書けます
    callmekohei
    @callmekohei
    ブレイスさん!ありがとうございます!
    bleis-tift
    @bleis-tift
    単にモナド(やモナドプラス)としてコンピュテーション式を使うのであれば、FSharpPlusの使い方を勉強するのがいいと思います
    omanuke
    @omanuke
    モッナード、いまだよくわからないマン(´・ω・`)
    話変わりますが、VS15からC#の中から使ってるF#の箇所にF12で飛べるようになってます?VSのおかげかReSharperのおかげかわからなくて…
    callmekohei
    @callmekohei
    なるほどです!FSharpPlusですね!(^_^)/
    bleis-tift
    @bleis-tift
    VS15をまだ入れてないw
    VSデフォルトでC#からF#に飛べるなら使い勝手かなり上がりますね
    あと、モナド自体は俺もよくわからんです!
    omanuke
    @omanuke
    えーブレイスさんが何を言ってるんですかー(´・ω・`)
    bleis-tift
    @bleis-tift
    使い方とか定義の仕方とかモナド則とかはわかるけど、モナド自体が結局どういうものなの?というのは分かってません!
    圏論をやればわかるようになるんだろうか・・・
    omanuke
    @omanuke
    むーん…この間Json.NetをParseするCompExpらしきものを作って便利ではあるけどほかの便利使い方が思いつかず…
    FSharpPlusみてみますー
    bleis-tift
    @bleis-tift
    @callmekohei F#でモナドの使い方とかを勉強するにはFSharpPlusはいいライブラリですけど、FSharpPlus自体はF# wayとは違うところにいるライブラリなので、がっつり入れ込まないようにした方がいいです
    omanuke
    @omanuke
    おお、なんかLensもはいってる
    bleis-tift
    @bleis-tift
    F#でモナドを勉強すべきなのかどうか、という葛藤。F#、標準ではoptionにすらコンピュテーション式用意してないし、いろいろとアレ
    色々入ってますよー
    callmekohei
    @callmekohei
    ブレイスさん!ありがとうございます(^_^)/
    bleis-tift
    @bleis-tift
    https://github.com/gmpl/FSharpPlus/blob/master/FSharpPlus/Kleisli.fs#L6 型パラメーターに'``ident`` が使えたのか、という気づき
    Matsushima, Kazuhiro
    @Gab-km
    F#、標準ではoptionにすらコンピュテーション式用意してない
    ほんこれ。Optionモジュールにはbindあるのに、Option<'T>には無いの…。
    あ、Option<'T>にあってもしかたないわw OptionBuilderがほしい…
    callmekohei
    @callmekohei
    This message was deleted
    Screen Shot 2016-05-10 at 09.24.47.png
    bleis-tift
    @bleis-tift
    なんだこのエラー・・・って思ったけど、VSでも警告出てるな・・・
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 1096 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 1097 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 1098 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 1099 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 1100 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 1256 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 1259 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 1263 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 1264 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 1709 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 2731 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 2737 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 2982 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 3006 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 3035 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 3142 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 3184 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    FSC: 警告 FS3186: F# メタデータ ノードをアセンブリ 'FsControl, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' のテーブル 'ivals' の位置 3204 で読み取るときにエラーが発生しました。このノードには、一致する宣言がありませんでした。この警告を報告してください。使用している F# アセンブリの再コンパイルが必要になる場合があります。
    @callmekohei FsControlのバージョンが違うのが気になります
    FsControlを2.0.0にしたらどうなりますか?
    callmekohei
    @callmekohei

    あら。コメントなしで画像アップしたました、、、。すいません。

    ブレイスさん!やってみます!(^_^)/

    callmekohei
    @callmekohei
    あ、ちなみに3186エラーは無視していいって書いてありましたので、#nowarn "3186"で無視してます!
    Ignore warnings about F# metadata.
    ただやはりFsControl2.0.0にしてもエラーになります(^_^;;
    うーん、Mzeroとかいうmoduleがないと。なんのことだろう?
    Screen Shot 2016-05-10 at 14.40.41.png
    bleis-tift
    @bleis-tift
    Mzero・・・