私はf#を学んでいるだけなので、おそらく私は非常にばかげたことをしています。関連するドキュメントを自由に教えてください。検索しましたが見つかりませんでした。Windows 7(.Net 4.0)でVisualStudio2010ベータ版を使用しています。
私の最初のf#プロジェクトではすべてが順調に進んでいます。まあ..ほとんどすべて。特に、次のコードを使用して、非常に単純な線形補間関数を作成しています。
let linterp (x:double) (xvalues:double list) (yvalues:double list) =
let num_els = xvalues.Length
if x <= xvalues.Head then
let result = yvalues.Head
elif x >= (List.rev xvalues).Head then
let result = (List.rev yvalues).Head
else for idx in [0 .. num_els] do
if List.nth xvalues idx >= x then
let x0 = xvalues.Item idx
let y0 = yvalues.Item idx
let x1 = xvalues.Item (idx+1)
let y1 = yvalues.Item (idx+1)
let result = y0 + (y1-y0)/(x1-x0)*(x - x0)
result
そして、私は私の理解を完全に逃れる一連のエラーを受け取ります。
これはエラーと警告のリストです:
最初、2番目、最後の「let」の「この「let」の戻り式にエラーがあります。正しいインデントの可能性があります」。
「誤ったインデントの可能性:このトークンは、位置(39:10)で開始されたコンテキストのオフサイドです。このトークンをさらにインデントするか、「if」に標準のフォーマット規則を使用してみてください
最後の行(結果)の「式のこのポイントまたはそれ以前の不完全な構造化コンストラクト」。
コンパイラが最初のリストを正しく推測できたので、タイプに注釈を付けるために少し汗を流さなければならなかったことを付け加えますが、2番目のリストでは、タイプは常にユニットとして推測されました。また、元のバージョン名前の結果をバインドしませんでしたが、次のように単に「式を返しました」
if x <= xvalues.Head then
yvalues.Head
またはで
else for idx in [0 .. num_els] do
if List.nth xvalues idx >= x then
let x0 = xvalues.Item idx
let y0 = yvalues.Item idx
let x1 = xvalues.Item (idx+1)
let y1 = yvalues.Item (idx+1)
y0 + (y1-y0)/(x1-x0)*(x - x0)
これにより、「for」の下に「この式にはタイプunitがありますが、ここではタイプdoubleで使用されています」というエラーが残り、「if」が誤ってインデントされている可能性があります。
これに対する解決策を見るとばかげていると思いますが、このような単純な問題に1時間以上も立ち往生しているので、よろしくお願いします。
前もって感謝します!
ps:[ツール]->[オプション]->....-> [F#]-> [タブ]メニューで、タブがスペースとして正しく解釈されることを確認しました
pps:これはSOに関する私の最初の質問です:-)