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
    ココ向けに書いたら量が増えすぎたのでブログのエントリにした
    http://bleis-tift.hatenablog.com/entry/how-to-make-computation-expression
    callmekohei
    @callmekohei
    This message was deleted
    adacola
    @adacola
    ループ再帰副作用非使用で書いてみました。再帰使った実装はkoheiさん自身で書いてみてください。
    callmekohei
    @callmekohei
    ウォォォ。アダコーラさんのコード、キレイ!僕のループのコードとは段違いです (^_^;) すごく勉強になります!再帰は、、、かなり難しくて、、、。が、頑張ります!ありがとうございます(≧∇≦)
    callmekohei
    @callmekohei
    ちょっとまとめてみました!
    http://callmekohei00.hatenablog.com/entry/2016/03/18/010033
    callmekohei
    @callmekohei

    <文字をシフトさせてリストを作る作業に関して>

    連日の投稿大変すみません。お手すきの時にでも。。。
    .
    したいこと

    インデックスリスト [[0; 0]; [0; 1]; [1; 0]; [1; 1]; [2; 0]; [2; 1]]
    のときに文字リスト ["A";"B";"C"]を下記のようにしたい。
    インデックスリストは文字を左にシフトさせる数を表してます。
    
    index is [0; 0] : result ["A"; "B"; "C"]
    index is [0; 1] : result ["A"; "C"; "B"]
    index is [1; 0] : result ["B"; "A"; "C"]
    index is [1; 1] : result ["B"; "C"; "A"]
    index is [2; 0] : result ["C"; "A"; "B"]
    index is [2; 1] : result ["C"; "B"; "A"]

    いまできてること

    index is [0; 0] : result ["A"; "B"]
    index is [0; 1] : result ["A"; "C"]
    index is [1; 0] : result ["B"; "A"]
    index is [1; 1] : result ["B"; "C"]
    index is [2; 0] : result ["C"; "A"]
    index is [2; 1] : result ["C"; "B"]

    問題

    さいごの1文字が取り出せない
    test関数の x::xs のところあたりが問題のような気がしてます。

    コード

    let index = [[0; 0]; [0; 1]; [1; 0]; [1; 1]; [2; 0]; [2; 1]]
    let lst = ["A";"B";"C"]
    
    let f n lst = List.partition (fun x -> x = List.item n lst ) lst
    
    let rec test acc lst idx =
        match idx with
        | [] -> List.rev acc
        | x::xs -> 
            let l = f x lst
            test ((List.head (fst l)) :: acc)  (snd l) xs
    
    let mutable i = 0
    for v in index |> List.map (test [] lst) do
        printfn "index is %A : result %A" (List.item i index) v
        i <- i + 1
    omanuke
    @omanuke
    ざっとみですが、idxの長さ分からしかaccにたされてないから二文字でわ
    callmekohei
    @callmekohei
    うぐっ。。omanukeさん、なるほどです。で、できました〜。ありがとうございます〜!
    let rec test acc lst idx =
        match idx with
        | [] -> 
            List.rev ((List.head lst)::acc)
        | x::xs -> 
            let l = f x lst
            test ((List.head (fst l)) :: acc)  (snd l) xs
    omanuke
    @omanuke
    まーそこらへんはF#どうこうと言うよりもただのデバッグの話でインタラクティブなりでtestの中、printfデバッグしたら一発だと思うので、してから投げるでいいかとは思います(´・_・`)
    callmekohei
    @callmekohei
    すみません。。失礼しました(^_^;;;
    callmekohei
    @callmekohei
    皆様のお知恵を拝借して、書き上げました!パズルをとくための完全に個人的娯楽仕様です (^_^)/ 本当にありがとうございます!
    https://github.com/callmekohei/koffeefx/blob/master/src/puzzle.fsx
    // 内容
    powerset, combinations, permutations and repeated permutations
    callmekohei
    @callmekohei

    <クロージャにかんして>

    クロージャを理解するのに難儀してます。たとえば下記のF#のコードのクロージャが理解できません。

        let mult i lst = List.map ( fun x -> x * i ) lst
        mult 3 [1..5] |> printfn "%A"

    下記のjavascriptのコードだと理解できます。

        // javascript での実装
        function makeAdder ( captured ) {
            return function ( free ) {
                return free + captured
            }
        }
    
        var add10 = makeAdder (10)
        add10 (32) // 42

    このjavascriptのコードをF#で書き直すとどうなりますでしょうか?トライしましたが書けませんでした。お知恵を拝借できると嬉しいです。

    Kouji Matsui
    @kekyo
    > let makeAdder captured = fun free -> free + captured
    ;;
    
    val makeAdder : captured:int -> free:int -> int
    
    > makeAdder 10
    ;;
    val it : (int -> int) = <fun:it@3>
    > let add10 = makeAdder 10
    ;;
    
    val add10 : (int -> int)
    
    > add10 32;;
    val it : int = 42
    >
    とか?
    callmekohei
    @callmekohei
    kekyoさん!ありがとうございます!理解できました!ということは前のF#コードのicapturedという理解です!
        let mult captured lst = List.map ( fun x -> x * captured) lst
        mult 3 [1..5] |> printfn "%A"
    Kouji Matsui
    @kekyo
    右から左に置き換えてみたんですが、問題点が合っていて良かった。jsのクロージャは良く問題にしてる人がいるけど、実は何が問題なのかわかってない...
    callmekohei
    @callmekohei

    <アクティブパターンに関して>

    下記コードプログラミングF#の179ページにエラーになるコードとして掲載されてるのですが、このコードをアクティブパターンにしたいと思いトライしましたが、できませんでした。ヒント頂けると嬉しいです。
        // エラーになる ( programming F# p179 )
        let containsVowel (word: string) =
            let letter = word.Chars
            match letter with
            | ContainsAny ['a';'e';'i';'o';'u'] -> true
            | Sometimescontains ['y'] -> true
            | _ -> false
    // 自分で考えてみたコード
        let (|'a'|'e'|'i'|'o'|'u'|) ( word: string ) = 
            match word.Chars with
            |'a'|'e'|'i'|'o'|'u' -> true
            | _ -> false
    bleis-tift
    @bleis-tift
    コンパイルエラーに色々とヒントが載っていると思いますよ
    callmekohei
    @callmekohei
    ブレイスさん!ありがとうございます!コンパイルエラーを参考にやってみます!
    callmekohei
    @callmekohei
    す、すみません。ここまではできたのですが、文字列の中に該当のcharがあるかどうかというのが、できません。。。ヒント頂けると嬉しいです。
    module Test =
    
        let (|Letter|) (word: string) = word.Chars(0)
    
        let ContainsVowel (word: string) =
            match word with
            | Letter 'a' -> true
            | Letter 'e' -> true
            | Letter 'i' -> true
            | Letter 'o' -> true
            | Letter 'u' -> true
            | _ -> false
    
        ContainsVowel "abc" |> printfn "%A"
        // true
    bleis-tift
    @bleis-tift
    パラメータ付きのアクティブパターンにするといいですよ
    callmekohei
    @callmekohei
    ぱ、パラメーター付きですね。やってみます!ヒントをありがとうございます(^_^)/
    omanuke
    @omanuke
    パラメタライズドアクティブパターンは引数と
    答えの部分になんか区切りがほしいような気もしてます…
    bleis-tift
    @bleis-tift
    それは思う。パラメタライズドアクティブパターンの引数なのか、結果のパターンなのか、使う側だけ見ても分からないことが・・・
    omanuke
    @omanuke
    引数:ParseRegex 答え
    みたいな方が分かりやすくはある
    ここの最後の例だと
    まあそれはそれでツッコミ所あるので苦肉の策なんですかね。
    答えとか考えないで別の考え方したらしっくりくるのかしら
    bleis-tift
    @bleis-tift
    This message was deleted
    パターンの場所に書けるトークンが制限されてるところを逆手にとって、ParseRegex<引数> 結果とかでもよかった感
    [引数]でも可
    Yukitoshi Suzuki
    @yukitos
    突然の宣伝ですが今年も是非F# Software Foundationのサポートメンバーへの参加を検討いただけると幸いです :)
    http://foundation.fsharp.org/join
    あと今年からサポートメンバーをスピーカーとして登録出来るようになるので、スピーカーになってもいいよという方は今週いっぱいくらいで @yukitos 宛にメッセージください
    スピーカー用のページが来週くらいには公開になるのでそれからでもいいんですが、今週中だと事前登録出来ます。
    事前登録特典は特にありません :P
    githubでPRベースで申請してもらう予定なのですが、事前登録のほうがコンフリクトしづらいというだけです。
    Kouji Matsui
    @kekyo
    ちょうひよっこだけど入ってみました
    Yukitoshi Suzuki
    @yukitos
    ありがとうございます!
    Kouji Matsui
    @kekyo
    Parameterized active recognizerって、Partialしかありえない? うまく書けなかった...
    
    let (|ContainsAny|_|) chars input =
      match input |> String.exists (fun strch -> chars |> Seq.exists (fun ch -> strch = ch)) with
      | true -> Some input
      | false -> None
    
    [<EntryPoint>]
    let main argv = 
        let str = "hoge"
        let result =
            match str with
            | ContainsAny ['a';'e';'i';'o';'u'] _ -> true
            | _ -> false
    
        printfn "%A" result
    
        0
    結果要らないんだけどなぁ
    adacola
    @adacola
    let (|Mimorin|) x (y : string) = if x = "mimorin" then Mimorin (y.ToUpper()) else Mimorin y
    match "umi" with Mimorin "mimorin" x -> x
    
    val ( |Mimorin| ) : x:string -> y:string -> string
    val it : string = "UMI"
    Partialじゃなくてもいけました
    callmekohei
    @callmekohei
    できました〜。ってみなさん、できてる〜(^_^)/ マイクロソフトのホームページに載ってた正規表現の分を使って書きました〜
    open System.Text.RegularExpressions
    
    module Test =
    
        let (|ParseRegex|_|) regex str =
            let m = Regex(regex).Match(str)
            if m.Success then 
                Some (List.tail [ for x in m.Groups -> x.Value ])
            else
                None
    
        let parseString str =
            match str with
            | ParseRegex "a|e|i|o|u" str -> true
            | _ -> false
    
        parseString "abc" |> printfn "%A" // true
        parseString "efg" |> printfn "%A" // true
        parseString "ijk" |> printfn "%A" // true
        parseString "opq" |> printfn "%A" // true
        parseString "uxy" |> printfn "%A" // true
        parseString "zzz" |> printfn "%A" // false
    partial にしないと警告がでました〜
     warning FS0026: This rule will never be matched
    adacola
    @adacola
    結果がいらないのであれば
    let (|Mimorin|_|) x (y : string) = if x = "mimorin" && y = "umi" then Some() else None
    match "umi" with Mimorin "mimorin" -> true | _ -> false
    みたいに書けます
    callmekohei
    @callmekohei

    kekyoさん。
    なぜに、

    ContainsAny ['a';'e';'i';'o';'u'] _

    と アンダースコアなんでしょ?

    ContainsAny ['a';'e';'i';'o';'u'] str

    のような気が、、、