Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    adacola
    @adacola
    型は
    選択肢1つしかないパターン=unit、選択肢2つ以上あるパターン=Choice、Partialパターン=option
    になってますね
    Kouji Matsui
    @kekyo

    IL見たら、FSharpOption<unit>がnullかどうかで判断してるので、仮にPartialじゃなく書けたとしてもそれほど影響はないってことがわかりました

    public static int main(string[] argv)
    {
        string str = "hoge";
        string text = str;
        FSharpList<char> fSharpList = FSharpList<char>.Cons('a', FSharpList<char>.Cons('e', FSharpList<char>.Cons('i', FSharpList<char>.Cons('o', FSharpList<char>.Cons('u', FSharpList<char>.Empty)))));
        string input = text;
        FSharpOption<Unit> fSharpOption = Program.|ContainsAny|_|((IEnumerable<char>)fSharpList, input);
        bool result = fSharpOption != null;
        FSharpFunc<bool, Unit> fSharpFunc = ExtraTopLevelOperators.PrintFormatLine<FSharpFunc<bool, Unit>>(new PrintfFormat<FSharpFunc<bool, Unit>, TextWriter, Unit, Unit, bool>("%A"));
        bool func = result;
        fSharpFunc.Invoke(func);
        return 0;
    }

    行ける、行けるでー

    char listのコストのほうが気になる
    callmekohei
    @callmekohei
    ブレイスさんの分、下記みたいにしたいのですが、可能ですか?
    module Test =
    
        let (|ContainsAny|_|) ( ch: char ) ( word: string ) =
            if word.Contains ( string ch ) then Some () else None
    
        let containsVowel = function
            | ContainsAny  ["a";"e";"i";"o";"u"] -> true
            | _ -> false
    
        containsVowel "abc" |> printfn "%A"
    bleis-tift
    @bleis-tift
    型が合いませんよ
    ch: charじゃなくてss: string seqにして、Containsを直接使わずにSeq.existsかませれば行けます
      let (|ContainsAny|_|) (cs: char seq) (word: string) =
        if cs |> Seq.exists (string >> word.Contains) then Some () else None
    
      let containsVowel (word: string) =
        match word with
        | ContainsAny "aeiou" -> true
        | _ -> false
    stringchar seqであることを使ったバージョン
    callmekohei
    @callmekohei

    ブレイスさん!ありがとうございます!

    cs |> Seq.exists (string >> word.Contains)

    ここの処理がわからなくて、、、。美しいです!

    callmekohei
    @callmekohei
    ちょっとアクティブパターンについてまとめました!
    http://callmekohei00.hatenablog.com/entry/2016/03/25/161246
    callmekohei
    @callmekohei

    <Mixinについて>

    ホームページみてたらmixinなる面白いの見つけました。
    https://fsharpforfunandprofit.com/posts/completeness-seamless-dotnet-interop/
    で、ちょっと前にはやった世界のナベアツmixinを使ってやってみようとおもいました。よければお手すきの時にでも。。。

    
    module SekaiNoNabeatu =
    
        type IAnimal = 
            abstract member Say : unit -> string
    
        let say (animal:IAnimal) = 
            animal.Say () |> printfn "%s" 
    
        type Geinin = Nabeatu
    
        type Geinin with
            member this.AsAnimal = 
                    { new IAnimal with member a.Say () = "test" }
    
        let geinin = Nabeatu
    
        [1..10] |> List.iter ( fun n -> say (geinin.AsAnimal ))

    いまできてることはtestを10回連続で表示させることだけです。この考え方でFizzBuzzのように3,5そして15のときtest3, test5そしてtest15と表示させることはできますでしょうか?ヒントを頂けると嬉しいです (^_^)

    MIYAZAKI Shohei
    @hafuu
    これ、世間で言う mixin じゃなくて mixing では?
    ただ既存のF#の型とインターフェイスを混ぜて使う時のアレコレなだけに見えますが
    それは置いておいて、test3, test5とかの表示は、
    fun n -> say (geinin.AsAnimal )の部分でif式書けばよいのでは
    Kouji Matsui
    @kekyo
    動物はみんなsayする、ナベアツだけが3の時(10も?)に特別なので、mixin?するAsAnimalの実装の所で、現在の数に応じて返される文字列を変えればいいと思うんですが、sayに現在の数を渡すというのはあまりスマートではない気が... (動物全体にとって、現在の数に興味があるようには思えない)
    mixinというとC++ templateを想像するんですが、F#にこれを行わせることはできない(?)ので、結果として同じような事が出来るという意味でmixinと言っているのかも
    MIYAZAKI Shohei
    @hafuu
    英語の記事にmixinなんて言葉出てこないですー
    Kouji Matsui
    @kekyo
    10じゃなくて5だった
    ほんとですね、mixingだった
    MIYAZAKI Shohei
    @hafuu

    とおもったけど書いてあった!

    // now mixin the interface with the F# types

    Kouji Matsui
    @kekyo
    (;´Д`)
    MIYAZAKI Shohei
    @hafuu

    結果として同じような事が出来るという意味でmixinと言っているのかも

    って感じですね

    callmekohei
    @callmekohei
    できました〜。参照?を使ってみました!
    
    module SekaiNoNabeatu =
    
        let counter init =
            let n = ref init
            (fun () -> Operators.incr n ; !n )
    
        let cn = counter 0
    
        type IAnimal = 
            abstract member Say : unit -> string
    
        let say (animal:IAnimal) = 
            animal.Say () |> printfn "%s" 
    
        type Geinin = Nabeatu
    
        type Geinin with
            member this.AsAnimal = 
                { new IAnimal with member a.Say () =
                    match string (cn ()) with
                    | "3" -> "test3 "
                    | "5" -> "test5"
                    | _ -> "test" }
    
        let geinin = Nabeatu
    
        [1..10] |> List.iter ( fun n -> say (geinin.AsAnimal ))
    callmekohei
    @callmekohei

    <ファイルを書き出すことに関して>

    度々申し訳ありません。ダウンロードしたwebベージのテキストをテキストファイルとして保存したいのですが、下記のようにしたのですが、うまくいきません。何か別の方法があるのでしょうか?お知恵を拝借できると嬉しいです。
    #r "./lib/FSharp.Data.dll"
    open FSharp.Data
    open System.IO
    
    module Test =
    
        let url = "http://tomasp.net"
        let path = @"./oFile.txt"
    
        // Download the content of a web site
        Http.RequestString ( url )
        |> System.IO.File.WriteAllText path // ここでエラーになる
    
    // error FS0505: 
    // The member or object constructor 'WriteAllText' does not take 1 argument(s). An overload was found taking 2 argumen
    Matsushima, Kazuhiro
    @Gab-km
    引数をf a bの形で受け取れるのは F# の関数だけであり、System.IO.File.WriteAllTextなど普通の.NETのライブラリではタプルの形で引数を渡す必要があります。
    今回はSystem.IO.File.WriteAllTextに渡したpath引数だけ食べられて、「(タプルとして)引数が1つしか渡されてないぞ!」と怒られていると思います。
    callmekohei
    @callmekohei
    ガブさん!できました〜!ありがとうございます!タプルなんですね!なるほどです!
    (path , Http.RequestString ( url ) )
    |> System.IO.File.WriteAllText
    omanuke
    @omanuke
    改めてで、結局どうしたらいいのよ感ある(´・ω・`) https://fsharp.github.io/2015/04/18/fsharp-core-notes.html#do-deploy-fsharp-core-as-part-of-your-application
    Kouji Matsui
    @kekyo
    PCLとか泣けてくる
    ritalin
    @ritalin
    [オフトピ] 開発者から愛される言語、第3位(Stack Overflow調べ)おめでとうございます http://www.infoq.com/jp/news/2016/03/stack-overflow-survey-2016
    Yukitoshi Suzuki
    @yukitos
    :tada:
    callmekohei
    @callmekohei
    :tada:
    callmekohei
    @callmekohei

    <FSharp.Data.dllというライブラリでの文字化けに関して>

    度々すみません。下記コードを実行すると日本語の部分が文字化けします。vimだけでなくvisual studio community 2015でも同様な症状が出ます。回避方法あればお知恵頂けると嬉しいです。

    #r "FSharp.Data.dll"
    open FSharp.Data
    
    module Test =
    
        let url = "http://www.aozora.gr.jp/index_pages/person81.html" 
        let results = HtmlDocument.Load ( url )
        results |> printfn "%A"

    結果

          <tr>
            <td class="header">作家名読み:</td><td>みやざわ けんじ</td>
          </tr>
    callmekohei
    @callmekohei
    あ、この青空文庫のときだけ文字化けして、例えばwikiのネコのページとかは文字化けしないのでサイトの問題ですね、、(^_^;;;
    adacola
    @adacola
    そのサイトの文字コードは本来はUTF-8ですが、レスポンスヘッダのContent-Typecharset指定がないのでおそらくLatin-1とかでエンコードされて文字化けしてますね
    HtmlDocument.Loadでは文字化けを回避する方法はないように思えます
    Http.RequestStringとかを使って文字列としてダウンロードしてからHtmlDocument.Parseを呼ぶのがいいと思われますが、どうやらそのサイトは適切にリクエストヘッダを指定しないとまともにレスポンス返してくれないっぽいのでがんばってくださいw
    callmekohei
    @callmekohei
    アダコーラさん!ありがとうございます!なるほどです!勉強になります!回避方法はなさそうなんですね、、、。ちゃんと表示されるwikiPediaで学習します。ありがとうございます(≧∇≦)
    adacola
    @adacola
    他のサイトでも目的が達成されるのであれば他のサイト使うのがいいですねw
    adacola
    @adacola
    ちなみに回避する方法がないのはあくまでHtmlDocument.Loadを使う場合で、文字化けしないようにして文字列としてダウンロードした後HtmlDocument.Parseに食わせれば回避できますよー。(適切にリクエストヘッダと文字コード指定してその方法で回避できたのを確認)
    callmekohei
    @callmekohei
    アダコーラさん!おはようございます!おおお。回避できるんですね。ちょっとやってみます!ありがとうございます!(^_^)/
    Kouji Matsui
    @kekyo
    FSharp.DataにHtml Parserがあるという事実を知って震えている (*´Д`)
    bleis-tift
    @bleis-tift
    誰かPR送るんじゃ~
    encodingStrとは・・・
    bleis-tift
    @bleis-tift
    encodingStrはリクエスト飛ばすときじゃなくて、レスポンスとして返ってきたもののエンコーディングにしか効かないっぽい
    bleis-tift
    @bleis-tift
    アルファベット順で逐一書いていくよりも、グループ別にまとめたほうがきれいだと思うんだけどな

    例えばこんな感じでアクティブパターン作れば、

    let (|HeaderEnum|_|) key =
      match key with
      | "accept-charset" -> Some HeaderEnum.AcceptCharset
      | ...
      | _ -> None

    意味も明白になる。

    match header.ToLowerInvariant() with
    | HeaderEnum key -> req.Headers.[key] <- value
    | ...
    adacola
    @adacola
    レスポンスのエンコーディングを強制的に変える機能は、accept-charsetヘッダでの指定をガン無視するサイト(i.e. 今回のサイト)もあるのでそれに対応するための機能として必要かなと思うんですが、encodingStrの型がSystem.Text.Encodingじゃなくて文字列なのがちょっと…