1

私は F# を学び始めたばかりで、テーブルから最初のレコードを取得する関数を試してみようと思った型推論に感銘を受けました (クエリ式、Linq スタイルを使用):

let getfirst data = 
    let result = query { for n in data do take 1 }
    result |> Seq.head

これは機能します。タイプはIQueryable<'a> -> 'aです。

しかし、なぜこのバージョンが機能しないのでしょうか?

let getfirst2 data = 
    query { for n in data do head }

前回と同じようfor n in data do headにスカラーを与えるべきではありませんか? 'a2 番目のバージョンが機能しない理由と、Seq.head を使用せずに機能させる方法を誰かが説明できますか?

4

2 に答える 2

1

理由はわかりませんが、 のdata引数にカーソルを合わせると、本来あるべきgetfirst2型の型であることがわかります。System.Linq.IQueryable<Linq.QuerySource<'a, System.Linq.IQueryable>>System.Linq.IQueryable<'a>

型注釈を追加することで「修正」できます。

open System.Linq
let getfirst2 (data : IQueryable<'a>) : 'a = query { 
    for item in data do
    head
}

その後、期待どおりに機能します。

[1 .. 10]
|> System.Linq.Queryable.AsQueryable
|> getfirst2
|> printfn "%d" // Prints 1.

たぶん、他の誰かが、コンパイラが型を推論する理由を明らかにすることができます。

于 2014-07-19T19:28:43.700 に答える