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
    F#の推論の仕方を考えると難しい気がします
    推論できても限定的で、あまり使えない感じも
    継承関係に関しては、F#の方針的に基底クラスを選ぶというのをやりそうにないです。
    配列リテラル等の限られた場所で、更に受け側の型が基底クラスの場合のみ基底クラスが選ばれますが、これは「特別扱い」としており、このようなものを増やすようには思えません
    omanuke
    @omanuke
    うーん、その辺は方針的にどうなのか分からんですが、それ置いとくと技術的にはいけますよね?
    限定的はどの辺を指します?
    bleis-tift
    @bleis-tift
    式の先頭から末尾方向に推論する特性上、ヒントが活用できる状況は限定的では?ということです
    また、感覚の話で申し訳ないんですが、推論部分を複雑にしすぎると人間にとって予測しにくい推論結果(こっちは推論できるのにこっちはできないのはなぜ?というパターン)が増えそう、というのがあります
    bleis-tift
    @bleis-tift
    当然、推論しようとしている変数のスコープ全体が使えるなら、クラスも今より推論できる部分は増えるでしょう。なぜF#の推論器がそうなってないのかはよくわかりません。
    その部分、Scalaの推論器も同じなので、変に影響されてしまったのかなぁ、とか
    omanuke
    @omanuke
    あー、F#だと型推論する箇所でこれかもーじゃなく決まるか決まらないかですかね。
    確かにルール複雑だと予期してない推論とかもあり得ますかねぇ
    HaskellとかだとNumっぽいかもー、いやdoubleでしたとかってなる?
    いずれにしても、型を書くのがだるいのでclassできるようになるとすてきなんですけどねぇ自分的には。VOICE漁ったらsuggestありそうですね。
    bleis-tift
    @bleis-tift
    あと、 .NETでは型をガチガチに決めないといけなくて(JVMの場合、型パラメーター部分はガチガチに決めなくていい)、その辺りも厄介な部分な気がします。
    型を書くのだるいから、できる限りメソッドを直接使わず、ラップした関数を使う派(ラップする関数を用意するのが今度はだるい
    omanuke
    @omanuke
    んーその辺でどう厄介になるかは疎くてよくわからんです…
    だるいすね…
    UserVoice探りましたが…何の成果も!えられませんでしたぁぁ!(´・ω・`)
    https://fslang.uservoice.com/
    bleis-tift
    @bleis-tift
    型推論の話とはまた微妙に違いますが、高階型を自然な形でメタデータに落とせないので、Haskellのようにオーバーロードの解決ができなくてつらいなー、という話でした
    高階型、欲しい
    omanuke
    @omanuke
    type classとかの話はちらふらあがってますねーやっぱりみなほしいんやな(´・ω・`)
    pocketberserker
    @pocketberserker
    談話室でkekyoさんにしゃべった(?)あたりのことをメモ。
    http://pocketberserker.hatenablog.com/entry/2016/03/10/195043
    bleis-tift
    @bleis-tift

    @pocketberserker 完全に思いつきなんだけど、

    type IAsync<'T> = interface end
    type AZero () = interface IAsync
    type Wrap<'T>(x: Async<'T>) = interface IAsync<'T>

    みたいな型階層用意して、ZeroではAZero返して、RunではWrap<'T>しか受け取らない、とかやって型合わせられないですかね

    pocketberserker
    @pocketberserker
    it cond then ceのceもAZeroを返す必要があって、それをWrapに変換するタイミングがないはずです
    bleis-tift
    @bleis-tift
    あー、if then elseだと型を完全に一致させないといけないかー
    pocketberserker
    @pocketberserker
    はい
    bleis-tift
    @bleis-tift
    じゃぁ、タグをつける感じでどうだ
    pocketberserker
    @pocketberserker
    どういうやつですかね?
    bleis-tift
    @bleis-tift
    type FromZero = class end
    type FromReturn = class end
    type A<'T, 'Tag>(x: Async<'T>) = ...
    こんな感じにしておいて、RunA<'T, FromReturn>のみを受け取る
    pocketberserker
    @pocketberserker
    あー、それは試してないですね
    bleis-tift
    @bleis-tift
    あ、だめか
    結局if then elseで死にそう
    ううむ・・・
    pocketberserker
    @pocketberserker
    あ、でもタプルと同じようなものだからおっしゃる通りif then elseでだめですね
    bleis-tift
    @bleis-tift
    どうやってもif then elseで同じ型にしなきゃいけないから、F#の型レベルでは解決できないっぽいな
    bleis-tift
    @bleis-tift
    type Zero = class end
    として、Async<Zero>をゼロ値とみなし、Run(f: unit -> Async<Zero>)Obsoleteでコンパイルエラーにとか
    pocketberserker
    @pocketberserker
    Async.Startをラップする形で開始時にゼロ値を渡すか、Unsafeモジュールでゼロ値をUnchecked.defaultofにするとかで今は回避してます
    Obsolete…なるほど、考えてもみなかったですね
    callmekohei
    @callmekohei

    <ファイル名取得に関して>

    たびたび申し訳ありません。おてすきの時にでも。。
    下記の文字列からファイル名だけ取り出したいです。
    おそらくファイル関係をあつかうクラスがあるような気がしますが
    見当がつきません。お知恵を拝借できれば嬉しいです。
    "/Users/kohei/Documents/myProgramming/myFSharp/mystudy/programmingF#/hello.fsx"
    
    "hello.fsx"
    Matsushima, Kazuhiro
    @Gab-km
    パスを扱いたいときは、System.IO.Pathクラスが役に立つ場面が多いです。
    callmekohei
    @callmekohei
    ガブさん!ありがとうございます!さっそくやってみます!
    できました〜。ありがとうございます!
    printfn "%A" (System.IO.Path.GetFileName str)
    Matsushima, Kazuhiro
    @Gab-km
    :+1: :
    Kouji Matsui
    @kekyo
    おぉ、DirectorySeparatorがスラッシュでも行けるんですね。一旦Uriとかを噛まさないとダメかと思った
    callmekohei
    @callmekohei

    <ビット演算について>

    たびたび申し訳ありません。お手すきの時に。。。
    下記にてprintfnの出力を2進数で出したいのですが
    10進数ででます。2進数で出すにはどのようにすればいいでしょうか?
    module TestBitOperator =
        printfn "%A" (0b0101 &&& 0b1100)
        // 4ではなく0b0100と表示させたい
    まずはここを読んでみましょう。ここに書いてないとすると、printfnでは2進出力ができない、ということかもしれません。
    callmekohei
    @callmekohei
    ガブさんありがとうございます!読んでみますっ(^_^)/
    Yukitoshi Suzuki
    @yukitos
    printfn "%s" <| "0b" + System.Convert.ToString(0b0101 &&& 0b1100, 2).PadLeft(4, '0')
    ;)
    callmekohei
    @callmekohei
    ユキトスさん!ありがとうございます!できました!ゆっくり♨️につかってくださいね(^_^)/
    callmekohei
    @callmekohei
    こんな感じでできましたー!ありがとうございます!
    module TestBitOperator =
    
        let test a (x:int, y:int) =
            match a with
            | "and" -> "0b" + System.Convert.ToString(x &&& y, 2).PadLeft(4, '0')
            | "or"  -> "0b" + System.Convert.ToString(x ||| y, 2).PadLeft(4, '0')
            | "xor" -> "0b" + System.Convert.ToString(x ^^^ y, 2).PadLeft(4, '0')
            | _ -> failwith "error!"
    
        printfn "%A" (test "and" (0b0101, 0b1100)) // "0b0100"
        printfn "%A" (test "or"  (0b0101, 0b1100)) // "0b1101"
        printfn "%A" (test "xor" (0b0101, 0b1100)) // "0b1001"