Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    callmekohei
    @callmekohei
    hafuuさん!ありがとうございます!ファイルパスを渡すと自動で解析してくれるんですね!便利!(^_^)/
    // これは動く
    let fpath:string = @"/usr/local/Cellar/mono/4.2.3.4/lib/mono/4.5/FSharp.Core.xml"
    type Provider = FSharp.Data.XmlProvider<"/usr/local/Cellar/mono/4.2.3.4/lib/mono/4.5/FSharp.Core.xml">
    let  doc      = Provider.Load fpath
    
    
    // でも実際はこのように書きたい(ファイルパスを1箇所にしときたい)
    let fpath:string = @"/usr/local/Cellar/mono/4.2.3.4/lib/mono/4.5/FSharp.Core.xml"
    type Provider = FSharp.Data.XmlProvider<fpath>
    let  doc      = Provider.Load fpath
    bleis-tift
    @bleis-tift
    Literal属性を付けるといいのでは?
    LoadするものがXmlProviderに与えたものと同じであれば、GetSampleというメソッドを使うという手もありますね
    type Doc = FSharp.Data.XmlProvider<"...">
    let doc = Doc.GetSample()
    [<Literal>]
    let DocPath = "..."
    type Doc = FSharp.Data.XmlProvider<DocPath>
    let doc = Doc.Load(DocPath)
    このどちらかでどうでしょう
    callmekohei
    @callmekohei
    bleisさん!ありがとうございます!うごきました〜!!!![<Literal>], GetSample()というのがあるんですね!素晴らしい。でもどこまで[<Literal>]が効いてるんだろ、、、みたいな(^_^;;
    [<Literal>]
    let  fpath:string = @"/usr/local/Cellar/mono/4.2.3.4/lib/mono/4.5/FSharp.Core.xml"
    type Provider     = FSharp.Data.XmlProvider<fpath>
    let  doc          = Provider.GetSample()
    bleis-tift
    @bleis-tift
    Xml(型)をProvideするからXmlProviderなので、Provideされた型にはProviderという名前はふさわしくないですよ
    それと、Literal属性付ける場合は大文字始まりにしておくのが無難です
    callmekohei
    @callmekohei
    なるほどです!ありがととうございます!本当にためになります!
    bleis-tift
    @bleis-tift
    MonadPlusとしてではなく、手続きとしてZeroが必要な場合はUnchecked.defaultofで十分じゃないだろうか、と思えてきた
    その値、多分使われない

    例えば

    b { if cond then return x }

    とか書かない

    ZeroCombineされないとしたら、それはバグ扱いでいい
    としたときに、これをコンパイル時エラーにできるだろうか・・・
    bleis-tift
    @bleis-tift
    無理か・・・
    そもそも上のコードをピンポイントでコンパイルエラーにできないし、できたとしても他の式と合成されたときにそれをキャンセルするの、不可能に思われる
    あー、ピンポイントでコンパイルエラーにするのはできるか
    内部でしか使われない型を用意して、Zeroはそれを返すようにしておけば上のコードは常にコンパイルエラーになる
    他の式と合成したときにそれを通るように・・・は、部分式に型が付かない以上F#ではどうやっても無理かな・・・
    bleis-tift
    @bleis-tift
    let case5 () =
      async {
        let mutable i = 0
        while i < 10 do
          if i = 5 then
            return -1
          i <- i + 1
        return i
      }
    @pocketberserker これの実行が終わらない気がする
    昨日のAsyncBuilder
    pocketberserker
    @pocketberserker
    よく考えたらあれだめでした
    絶対continueになります…
    open System
    
    type FlowControl = Break | Continue
    
    type AsyncBuilder internal () =
      member __.Zero<'T>() = async.Return((Unchecked.defaultof<'T>, Continue))
      member __.Return(x) = async.Return((x, Break))
      member this.ReturnFrom(x: Async<_>) = async.Bind(x, fun x -> this.Return(x))
      member __.Bind(x, f) = async.Bind(x, f)
      member this.Using(x, f) = async.Using(x, f)
      member this.Combine(x, y) =
        async.Bind(
          x,
          fun (x, cont) ->
            match cont with
            | Break -> async.Return((x, Break))
            | Continue -> y
        )
      member this.While(guard, prog) =
        if not (guard ()) then this.Zero()
        else this.Combine(prog, async.Bind(prog, fun _ -> this.While(guard, prog)))
      member this.For(xs: #seq<_>, f) =
        this.Using(
          xs.GetEnumerator(),
          fun itor -> this.While(itor.MoveNext, async.Delay(fun () -> f itor.Current)))
      member this.Delay(f) = async.Delay(f)
      // これじゃだめなの?という気持ち
      member this.Run(v: Async<_ * FlowControl>) = async.Bind(v, fun (x, _) -> async.Return(x))
    bleis-tift
    @bleis-tift
    While がおかしくない?
    pocketberserker
    @pocketberserker
    ↑のですか?昨日のですか?
    bleis-tift
    @bleis-tift
    上のやつ
    1回のループで最大2回 prog が実行されちゃわない?
    pocketberserker
    @pocketberserker
    あ、Combineいらないですね…
    bleis-tift
    @bleis-tift
    Combineないと、Whileの中から return できない気がする
    結果を常に捨てちゃうので
    pocketberserker
    @pocketberserker
    あー
    bleis-tift
    @bleis-tift
    で、多分 Bind の方を消すとスタックオーバーフローになる気がする
    pocketberserker
    @pocketberserker
    でもAsyncのwhileAも同じ作りなんですよね…
    bleis-tift
    @bleis-tift
    AsyncのwhileAは間違っているので無視してください
    pocketberserker
    @pocketberserker
    あ、いや、あっちはcombineなしか
    bleis-tift
    @bleis-tift
    あぁ、Combine(sequentialA?)ではなく、Bind(bindA)使ってますね
    pocketberserker
    @pocketberserker
    member this.While(guard, prog) =
      if not (guard ()) then this.Zero()
      else this.Combine(prog, async.Bind(this.Zero(), fun _ -> this.While(guard, prog))
    こうかな?
    bleis-tift
    @bleis-tift
    ZeroをそこでBindしちゃうと、中で持ってる関数の連鎖がそこで切られてしまってまずい気がする?
    ちょっとやってみるかー
    pocketberserker
    @pocketberserker
    うーん、テストケース作らないと難しい…
    bleis-tift
    @bleis-tift
    async { () } すらコンパイルが通らなくなった件
    いや、これは俺のコードが色々と混ざってるせいかも
    Yukitoshi Suzuki
    @yukitos
    (今週金曜の談話室っぽいイベント、懇親会とか考えてないですけどどうしますかねえ
    bleis-tift
    @bleis-tift
    お、いけたっぽい?
    pocketberserker
    @pocketberserker
    懇親会、翌日参加しない組向けにあると良いとは思います
    (が、翌日ある組は体力…)