3

else ステートメントの前の行は明らかにユニットを期待していましたが、代わりにブール値を取得しました。私はF#を始めたばかりですが、これを理解することはできません.

私は以前に Stackoverflow を使用したことがなく、コードボックスがまだ私を混乱させているので、レイアウトと少し戦っています! 元のスペースは正しくインデントされていると思います。

let m = Dictionary<int, int>() 

let rec fib i = 
    match i with
    | 1 -> i
    | 0 -> i
    | _ -> 
        if m.ContainsKey(i) then  
           if m.[i] > 0 then 
              m.[i] 
            else
              let x = fib(i - 1) + fib(i - 2)
              m.Add(i, x)
        m.[i] 

これらの投稿でスペースを維持する方法を誰かが教えてくれたら、私は感謝します!

4

2 に答える 2

5

最後のビットは少し間違っています-そうあるべきです

if m.ContainsKey(i) then  
       if m.[i] > 0 then 
          m.[i] 
        else
          let x = fib(i - 1) + fib(i - 2)
          m.Add(i, x)
          x

if ステートメント内から戻っています。おそらくif m.[i] > 0どちらも必要ありません。この場合、あなたは得る

let m = Dictionary<int, int>() 

let rec fib i = 
    match i with
    | 1 -> i
    | 0 -> i
    | _ -> 
        if m.ContainsKey(i) then  
            m.[i] 
        else
            let x = fib(i - 1) + fib(i - 2)
            m.Add(i, x)
            m.[i]

Stackoverflow で書式設定するには、コードを貼り付けてハイライト表示し、ctrl+k を押すか、{}ボタンを押してセクションを自動的にコード モードにします (コードは通常のテキストよりも 4 スペース分インデントされます)。

于 2012-11-30T09:45:56.310 に答える
3

あなたがそのような種類の言語に不慣れな場合、犯しやすい間違いです。F# は式ベースであるため、if--句は何かに評価される式であることに注意してくださいthenelseこれを行うには、パターン マッチングと同様に、型チェッカーは if 式のすべての分岐が同じ型である必要があります。さらに、if終了else分岐がない式は、分岐の型が である場合にのみ有効ですunit

これらのことを念頭に置くと、次の 2 つの理由により、このスニペットが型チェックに合格しないことがわかります。

  1. ネストされたif式には、さまざまな型の値を生成する分岐があります (つまりint、 とunit) および
  2. 外側のif式は、内側の式が type を持つことを期待していunitます。

お役に立てれば :)

于 2012-11-30T11:28:43.807 に答える