Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    Better async stack tracesってのがありますね
    Kouji Matsui
    @kekyo
    自己解決: .NET 40 TaskでWait()とかResultしたときに内部で発生した例外はAggregateExceptionに内包されるしかなく、.NET 40ではawaitの文脈はないので(=ExceptionDispatcherInfoの実装もない)、AggregateExceptionに内包されるのは不可避。.NET 45でawaitした場合は、async method内でtry-catchする場合においては、catch型はスローされた型で問題ない(AggregateExceptionに内包されない・ExceptionDispatcherInfoを使う)けど、ひとたびasync context外に出ると、そこにはWait()かResultが待っているので、そこでAggregateExceptionに内包される。この流れがAsync computation式でも式外に出た時に同じと考えれば、式内ではスローされた型を直接扱えるけど、式外に出たらAggregateExceptionに内包される、という流れに対応する。 長い (*´Д`)
    Kouji Matsui
    @kekyo

    確かめてみた:

    > let asyncTest = async {
      failwith "hoge"
    };;
    
    val asyncTest : Async<unit>
    
    > try asyncTest |> Async.StartImmediate with
      | _ as ex -> printfn "%A" ex;;
    System.Exception: hoge
       場所 <StartupCode$FSharp-Core>.$Control.StartImmediate@1471-1.Invoke(Exception exn)
       場所 Microsoft.FSharp.Control.CancellationTokenOps.StartWithContinuations@1230-1.Invoke(Exception x)
       場所 <StartupCode$FSharp-Core>.$Control.loop@425-40(Trampoline this, FSharpFunc`2 action)
       場所 Microsoft.FSharp.Control.Trampoline.ExecuteAction(FSharpFunc`2 firstAction)
       場所 Microsoft.FSharp.Control.TrampolineHolder.Protect(FSharpFunc`2 firstAction)
       場所 Microsoft.FSharp.Control.AsyncBuilderImpl.startAsync[a](CancellationToken cancellationToken, FSharpFunc`2 cont, FSharpFunc`2 econt, FSharpFunc`2 ccont, FSharpAsync`1 p)
       場所 Microsoft.FSharp.Control.CancellationTokenOps.StartWithContinuations[T](CancellationToken token, FSharpAsync`1 a, FSharpFunc`2 cont, FSharpFunc`2 econt, FSharpFunc`2 ccont)
       場所 Microsoft.FSharp.Control.FSharpAsync.StartWithContinuations[T](FSharpAsync`1 computation, FSharpFunc`2 continuation, FSharpFunc`2 exceptionContinuation, FSharpFunc`2 cancellationContinuation, FSharpOption`1 cancellationToken)
       場所 Microsoft.FSharp.Control.FSharpAsync.StartImmediate(FSharpAsync`1 computation, FSharpOption`1 cancellationToken)
       場所 <StartupCode$FSI_0009>.$FSI_0009.main@()
    val it : unit = ()
    
    > try asyncTest |> Async.Start with
      | _ as ex -> printfn "%A" ex;;
    val it : unit = ()
    > System.Exception: hoge
       場所 Microsoft.FSharp.Control.CancellationTokenOps.Start@1224-1.Invoke(Exception e)
       場所 <StartupCode$FSharp-Core>.$Control.loop@425-40(Trampoline this, FSharpFunc`2 action)
       場所 Microsoft.FSharp.Control.Trampoline.ExecuteAction(FSharpFunc`2 firstAction)
       場所 Microsoft.FSharp.Control.TrampolineHolder.Protect(FSharpFunc`2 firstAction)
       場所 <StartupCode$FSharp-Core>.$Control.-ctor@510-1.Invoke(Object state)
       場所 System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
       場所 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       場所 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
       場所 System.Threading.ThreadPoolWorkQueue.Dispatch()
       場所 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
    エラーのため停止しました

    StartImmediateすると、現在のスレッドを使用して式を実行するので、発生した例外は順当にcatchされる。Startした場合は別のスレッドで実行され、そこで発生した例外を、式外で受ける事は出来ない(?) スレッド死んだことになっているような...

    Async.Start -> unitなので、TaskみたいにWait出来ないから仕方がない?
    callmekohei
    @callmekohei

    <XML/RSSの取得について>

    ほんとうに度々すみません。プログラミングF#の187ページ(例7−11)のようにXMLをパターンマッチにかけて表示させるコードを書きたいです。まずはXMLを表示させようと思いましたが、空のseqが返ってきます。とくには間違ってないとは思うのですが、、、。ヒントを頂けるとうれしいです。長文すみません。
    .

    やりたいこと

    こんな感じでXML/RSSを取得したい!

    <item>
        <title>【 29日(火) 福岡(福岡) 】 晴後曇 - 20℃/8℃ - Yahoo!天気・災害</title>
        <link>
        http://rdsig.yahoo.co.jp/weather/rss/RV=1/RU=aHR0cDovL3dlYXRoZXIueWFob28uY28uanAvd2VhdGhlci9qcC80MC84MjEwLmh0bWw_ZD0yMDE2MDMyOQ--
        </link>
        <description>晴後曇 - 20℃/8℃</description>
        <pubDate>Tue, 29 Mar 2016 05:00:00 +0900</pubDate>
    </item>

    .
    最終的にやりたいことは、、、

    <title> .... </title> と挟まれている文字列だけを抜き出したい!

    29日(火) 福岡(福岡) 】 晴後曇 - 20℃/8℃ - Yahoo!天気・災害
     【 30日(水) 福岡(福岡) 】 晴時々曇 - 21℃/12℃ - Yahoo!天気・災害

    .

    コード

    #r @"../lib/FSharp.Data.dll"
    #r @"../../System.Xml.dll"
    open FSharp.Data
    open System.Xml
    
    module Test_XML =
    
        // XML source
        let xmlDoc = 
            let url =  "http://rss.weather.yahoo.co.jp/rss/days/8210.xml"
            let doc = new System.Xml.XmlDocument()
            doc.LoadXml (Http.RequestString ( url ) )
            doc
    
        xmlDoc |> printfn "%A"

    結果

    seq
      [seq [];
       seq [seq [seq [seq []]; seq [seq []]; seq [seq []]; seq [seq []]; ...]]]
    Yukitoshi Suzuki
    @yukitos
    seqがそれなりな構造に対応して並んでいるように見えるので単に%Aでは表示されていないだけでは?
    callmekohei
    @callmekohei
    いろいろやってみたのですが、たとえば下記でやってみても最終的に<null>になっているので、実データーが入ってないような気がするのですが、、、。
        xmlDoc.ChildNodes.ItemOf (0) |> printfn "%A"
        xmlDoc.ChildNodes.ItemOf (1) |> printfn "%A"
        xmlDoc.ChildNodes.ItemOf (2) |> printfn "%A"
    seq []
    seq [seq [seq [seq []]; seq [seq []]; seq [seq []]; seq [seq []]; ...]]
    <null>
    Yukitoshi Suzuki
    @yukitos
    Http.RequestString ( url )の戻り値にはちゃんとデータが入っているんです?
    callmekohei
    @callmekohei
    文字列としてばっちり取得できてます(^_^)
        let url =  "http://rss.weather.yahoo.co.jp/rss/days/8210.xml"
        Http.RequestString ( url )  |> printfn "%A"
    //一部のみここでは表示。。。
    "<?xml version="1.0" encoding="utf-8"?>
    <rss version="2.0"><channel><title>Yahoo!天気・災害 - 福岡(福岡)の天気</title><link>htt
    bleis-tift
    @bleis-tift
    それはXmlDocumentがそのように出しているだけですね
    OuterXmlすればちゃんと読み込めていることがわかるはずです
    まぁ、XmlDocumentじゃなくてXDocument使ったほうがいい、とかそういう話はあります
    Yukitoshi Suzuki
    @yukitos
    "%A"はそれほどには万能じゃないということですね;)
    bleis-tift
    @bleis-tift
    ですね。ちなみに、XDocumentであれば%Aでいい感じに表示されます。
    omanuke
    @omanuke
    F#の型じゃない奴はToStringの内容とか出してるんでしたっけ?
    bleis-tift
    @bleis-tift
    ToStringとも違うものが出てるっぽいんですよねー
    DebuggerDisplayとか見てるんだろうか
    callmekohei
    @callmekohei
    This message was deleted
    Kouji Matsui
    @kekyo
    別解してみた:
    open System.Net.Http
    open System.Xml.Linq
    
    let asyncFetch (url: string) = async {
        use httpClient = new HttpClient()
        use! stream = httpClient.GetStreamAsync url |> Async.AwaitTask
        return XDocument.Load(stream)
      }
    
    [<EntryPoint>]
    let main argv = 
        let doc = asyncFetch "http://rss.weather.yahoo.co.jp/rss/days/8210.xml" |> Async.RunSynchronously
        printfn "%A" doc
        0
    %Aはここらへんかな
    うっわ、この読む気なくす実装・・・
    omanuke
    @omanuke
    いろいろやってくれるのはわかったのでもうおなかいっぱいです(´・ω・`)
    Kouji Matsui
    @kekyo
    富豪的機能
    ある意味シリアル化
    bleis-tift
    @bleis-tift
    XmlDocumentの親クラスであるXmlNodeIEnumerableなので、https://github.com/Microsoft/visualfsharp/blob/95fb299ab8588b112246f986148de9da8dbc9a4b/src/utils/sformat.fs#L1094 に入っていくっぽいですね
    ここでseqって文字列が付くようです
    ふむ、boundedUnfoldLseqの項目も文字列化するみたいですね。その時にobjLを使うので、再帰的になっているわけだ
    callmekohei
    @callmekohei
    XDocument.Loadって文字列じゃなくてファイルしか読まない???エラーになってしまいます。。。(^_^;;
    #r @"../lib/FSharp.Data.dll"
    #r @"../../System.Xml.Linq.dll"
    open FSharp.Data
    open System.Xml.Linq
    
    module Test_XML =
    
        let url =  "http://rss.weather.yahoo.co.jp/rss/days/8210.xml"
        let xDoc = System.Xml.Linq.XDocument.Load ( Http.RequestString ( url ) ) // ここでエラー
        (* xDoc |> printfn "%A" *)
    bleis-tift
    @bleis-tift
    Parseを使いましょう
    callmekohei
    @callmekohei
    で、で、できました〜〜〜〜。すごく嬉しいです〜〜〜〜。ありがとうございます!!!!!!皆様!
    bleis-tift
    @bleis-tift
    イテレーターから取得した要素をitemLにかけるんだけど、これがなぜ表示されないんだ・・・?
    あー、Nodeの末端に何がいるか、か
    bleis-tift
    @bleis-tift
    なるほどなるほど、XmlElementまでたどり着くけど、こいつもIEnumerableだけど末端だからそれ以降進まなくなるのね
    で、結局構造を写し取っただけの空のseqのネストが出力される、と
    結論:DebuggerDislpayは見ていない。%Aの内部でSystem.Collections.IEnumerableに対する特別処理が入っていて、そこで列挙されて文字列化される。
    もう一つ結論:XmlDocumentは捨てよう
    Yukitoshi Suzuki
    @yukitos
    +1 to discard XmlDocument :)
    callmekohei
    @callmekohei
    +1 to discard XmlDocument :)
    Yukitoshi Suzuki
    @yukitos
    この間F#談話室に来ていたフランスの人?からTwitterで質問があって、
    Mac上のXamarinでパッケージのインストールにこけるらしいんですが何かご存じのかたいませんかしら
    im a noobie.im sure the answer is simple. but i don't understand how to install a package on a F# solution. specifically i had an error while installing the package spreads (which i talked about few days ago)
     and when im navigating in a solution, i see the button for upgrading package for example but the button for installing package is greyed and not accessible
    bleis-tift
    @bleis-tift
    Mac・・・
    Kouji Matsui
    @kekyo
    Xamarin...
    pocketberserker
    @pocketberserker
    おうちに かえらないと かんきょうが ない
    Yukitoshi Suzuki
    @yukitos
    僕も環境持ってないのでなんともかんとも。
    omanuke
    @omanuke
    packageってNuget?
    adacola
    @adacola
    かいしゃに いかないと かんきょうが ない
    Yukitoshi Suzuki
    @yukitos
    Nugetなんですかね?F#ソリューションでパッケージをインストールしようとしたっていうことしか聞いてないんですけども。
    Spreadsというパッケージらしいです