Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    Kouji Matsui
    @kekyo
    ありがとうございます。わりと書き上げたらさくっと公開してしまうほうなので、参考に修正しておきます!
    callmekohei
    @callmekohei

    <mscorlibに関して>

    C#ポケットリファレンスという本の202ページにコレクションのクラス・インターフェースとして下記のlstの分が載ってたのですが、mscorlibから引っ張りだせません。名前が違うのでしょうか?ヒントを教えていただけると嬉しいです。

    module Test =
    
        let dotNetAPIList =
            typeof<obj>.Assembly.GetTypes ()
            |> Array.map ( fun t -> ( t.Namespace, t.Name ) )
            |> Array.sortBy id
            |> Array.distinct
    
        let mySeek targetName =
            dotNetAPIList
            |> Array.filter ( fun tpl -> snd tpl = targetName )
            |> Array.iter ( printfn "%A" )
    
        let lst = ["ICollection";"List";"LinkedList"
                   "HashSet";"Dictionary";"Queue";"Stack"]
    
        for v in lst do
            mySeek v

    結果

    ("System.Collections", "ICollection")
    ("System.Collections", "Queue")
    ("System.Collections", "Stack")
    Matsushima, Kazuhiro
    @Gab-km
    例えば LinkedList についてですが、まずはMSDNの該当ページを参照してみましょう。
    ここの頭の方に「アセンブリ」という項目がありますが、ここには「System.dll にあるよ!」と書いてあります。
    こういうので意図は合っていますか?
    callmekohei
    @callmekohei

    ガブさん!ありがとうございます!

    typeof<obj>.Assembly.GetTypes ()

    ということはここの部分が違ってるということっぽい??

    Matsushima, Kazuhiro
    @Gab-km

    obj (System.Object クラス)はmscorlibの持ち物なので、上のやり方だと

    (* obj型の入っているアセンブリにある型全てを取得する => mscorlibに入っている型だけ取得する *)
    typeof<obj>.Assembly.GetTypes ()

    という意味になるかと思います。

    callmekohei
    @callmekohei
    なるほどです。。
    このdllから情報を引っ張ればいいのか〜。どうやれば。。。
    Screen Shot 2016-05-16 at 20.34.29.png
    Matsushima, Kazuhiro
    @Gab-km
    ところで、上の lst で指定しているクラス名ですが、mscorlibにあるもの、つまりSystem.Collections直下にあるものを意図していますか?
    System.Collections.Genericの方を探す必要があったりしないでしょうか……?
    型名からは、ジェネリックあり/なしが判別できませんでしたので。。。
    callmekohei
    @callmekohei
    System.Collections.Genericも、含まれてます!それでも出てこなかったので、不思議におもったのですよ。
    Matsushima, Kazuhiro
    @Gab-km
    例えばですが、AppDomainにある全てのアセンブリを取ってきて、その中の全ての型を見て回る、というのはどうでしょうか?
    callmekohei
    @callmekohei
    ありがとうございます!やってみます!
    omanuke
    @omanuke
    F#のasyncに比べてのC#のasyncやTaskの意味不明さにキレそう
    callmekohei
    @callmekohei
    できました〜。結論からいうと名前が違ってました!
    // mscorlib
    ("System.Collections", "ICollection")
    ("System.Collections.Generic", "List`1")
    ("System.Collections.Generic", "Dictionary`2")
    ("System.Collections", "Queue")
    ("System.Collections", "Stack")
    
    // SystemCoreDll
    ("System.Collections.Generic", "HashSet`1")
    ("System.Linq.Expressions.Compiler", "Stack")
    
    // SystemDll
    ("System.Collections.Generic", "LinkedList`1")
    こんな感じでした〜
    Class Name   Assembly         Namespace                    alias name
    ----------   ---------------  ------------------           -------------
    ICollection  mscorlib.dll     System.Collections
    List         mscorlib.dll     System.Collections.Generic   List`1
    LinkedList   System.dll       System.Collections.Generic   LinkedList`1
    HashSet      System.Core.dll  System.Collections.Generic   HashSet`1
    Dictionry    mscorlib.dll     System.Collections.Generic   Dictionary`2
    Stack        mscorlib.dll     System.Collections
    Queue        mscorlib.dll     System.Collections
    一応コードです。AppDomainのコードはこれからとりかかります!
    https://gist.github.com/callmekohei/08dd448615c029b97974871b6be2e7de
    KURATA Sayuri
    @sayurin
    それはAppDomainではないですねぇ…ただ実行時なので読み込んでない場合は見つかりませんから、そのコードの方法でもいいのかも
    callmekohei
    @callmekohei
    sayurinさん!なるほどです!
    Kouji Matsui
    @kekyo
    わかりにくいです > Task Taskからやったので慣れたんですが、F# Async理解して拍子抜けしたというか、あれこんなに簡単だっけ?みたいな
    あんまり詳しく解説してないですが: http://www.kekyo.net/2016/04/17/5804
    omanuke
    @omanuke
    今日調べてたのはイベントが不定期に上がり、それをUIスレッド上でイベントに応じた非同期の処理、例えばViewをPopupアニメーションして表示し終わったら処理を抜けるなどをしたくて、イベントをもとにasync Task Hoge(xxx){xxx}などと記述されたものをシーケンシャルに実行する…だったんですが、TaskとTask<T>でいろいろ扱い違うし、イベントをF#のasync式のように変換してから適当なタイミングで実行とかしたかったけど、asyncで書かれたものを実行せずにTask化する方法分からないし、なんかRxのConcatでいけそうだったんだけどうまく動かないしで、何の成果も得られませんでしたー(´・ω・`)
    自分的にはTaskへの変換とその評価としての実行が分離しにくいのがとてもいやんな感じです(;´・ω・)
    adacola
    @adacola
    RxのConcatって最初のObservableがCompletedにならないと次のObservableの処理に移らないのでそのせいだったりしませんか?
    もしそうならMergeでいけるかもしれません
    あーでもMergeだとTaskを1つずつシーケンシャルに実行ができませんね…
    Kouji Matsui
    @kekyo
    あー出来るんかな > asyncで書かれたものを実行せずにTask化する
    KURATA Sayuri
    @sayurin
    Taskって実行開始するのが前提にありませんでした?
    Kouji Matsui
    @kekyo
    メソッド内の最初のawaitまでは普通に動いてしまう(Async.StartImmediateみたいなもの)ので、Func<Task<T>>みたいなので受けておいて、必要になったら呼び出して開始かなぁ
    シーケンシャルに処理を並べたいのなら、単に順番に await HogeAsync(); await HagaAsync(); ... とかやれば良いですよ
    iterateできるなら foreachで回しながらawaitするとかかな
    TaskとTask<T>でいろいろ扱い違う というのは分からなかった。TResult以外に違う?
    これは全くその通り > Taskへの変換とその評価としての実行が分離しにくい
    KURATA Sayuri
    @sayurin
    Action : Func vs Task : Task<T> で、コードが共通化できないことが扱いづらいって言っているんじゃないかな
    F# asyncでもそこのところが面倒だし…
    KURATA Sayuri
    @sayurin
    Async.AwaitTaskの引数はTask<T>だからTaskを扱えないのよねぇ…
    Kouji Matsui
    @kekyo
    KURATA Sayuri
    @sayurin
    ほぅ
    omanuke
    @omanuke
    メンションもらったですがFunc<Task>みたいのでasyncで書かれたものを遅延開始すれば行けそうですが、そもそもConcat開始してるTaskでないと
    動作しない予感
    なんかTaskだとシグネチャ合わないのあったんですよね…
    Rxで一発華麗にできないかと思ってましたが、おとなしくループでシコシコイテレートします…
    この辺は式が主体の関数型と実行主体の手続き型の思想の違いから来てるんですかね…けど昔作ったスレッドクラス、実行を別の場所で開始できるよう値の作成と実行は分離したよな…(´・_・`)
    Fusionみさせてもらいますー
    callmekohei
    @callmekohei

    <ツリー表示したいです>

    たびたびすいません。ツリー表示をしたく昨日から考えてるのですが、
    泥臭い方法しか思いつきません。なにかもっといい方法あればヒントをいただけると
    うれしいです。
        // このリストを
        let lst = [ "Microsoft.FSharp.Collections.Array2DModule"
                    "Microsoft.FSharp.Collections.ListModule"
                    "Microsoft.FSharp.Collections.MapModule" ]
    
        // このように表示させたい
        "Microsoft"
        "    FSharp"
        "        Collections"
        "            Array2DModule"
        "            ListModule"
        "            MapModule"
    今できてるコード
    
        let zero = ["Microsoft"]
        let fist = ["FSharp"]
        let scnd = ["Collections"]
        let four = ["Array2DModule";"ListModule";"MapModule"]
    
        let f0 = fun s -> String.replicate 0 "\t" + s
        let f1 = fun s -> String.replicate 1 "\t" + s
        let f2 = fun s -> String.replicate 2 "\t" + s
        let f3 = fun s -> String.replicate 3 "\t" + s
    
        zero |> List.map f0 |> List.iter (printfn "%A" )
        fist |> List.map f1 |> List.iter (printfn "%A" )
        scnd |> List.map f2 |> List.iter (printfn "%A" )
        four |> List.map f3 |> List.iter (printfn "%A" )
    KURATA Sayuri
    @sayurin
    ツリーはサラッと綺麗に書くのは辛いですねぇ。ツリーを表すデータ構造を定義したりまぁしなくてもいいですが、groupByと再帰で書くことになるかな