2016-09-25 45 views
0

私はこの関数型プログラミング言語f#を初めて使用していますが、この小さなコードにはいくつかの問題があるかもしれませんが、なぜ実行しないのか不思議です。値またはコンストラクタnが定義されていません

エラーコードFS0039を返します。値またはコンストラクタnが定義されていません。なぜか分からない。関数sumを呼び出して結果に代入すると、引数4(n)が渡されます。

あなたが見たものを教えてくれますか?

ありがとうございます。

私は、関数、再帰的にしたい:

let rec recSum (n:int):int = 
if n > 0 then 
    recSum n * (n+1)/2 
    printf "%A " n 
else 
    n 
recSum 4 

をしかし、私はそれがintを返すように傾けます。ユニットを返す。

+0

悪いの書式を:

関数内のシャドーイング、ユニットを返しますか? :-) – s952163

答えて

1

はあなたの関数は次のようである

let sum' (n:int):int = 
    n * (n+1)/2 

sum' 4 

(n:int)の種類を指定します関数の引数、第2の:intは関数の出力を指定します。だから、sumはintをとりintを返す関数です。命名は、そのようなnumOfCorrelか何かのように、より良いかもしれない

[1..4] |> List.map sum' 

:だから今、あなたはこのような何かを行うことができます。 これであなたが何かを追うことになっている可能性があります。その場合、あなたのアルゴリズムや、あなたの入力に期待される出力を指定してください。元の質問の

作業バージョン:

let sum2 (n:int):int = 
    let mutable s = 1 
    while s <= n do 
     s <- n * (n+1)/2 
    s 

let result = sum2 4 

この場合sum2ではintとリターンとintかかります。関数内にprintfnを置くと、結果が出力され、()ユニットを返します。最初の行の元の関数はそれほど意味がありません。つまり、私はintを受け取り、intを返し、私はsに等しい関数です。明らかに、上記のs値が定義されていないので、F#コンパイラは不平を言うでしょう。非常に簡単なイントロについては、F# SyntaxとさまざまなドキュメントをVisual F#に読んでください。

let s = 4 
let sum3 (n:int): unit = 
    let mutable s = 1 
    while s <= n do 
     s <- n * (n+1)/2 
    printfn "%A" ("s = " + (string s)) 
sum3 4 
s 
+0

はい正しいです。そして、私はそれがwhileループなしで実際に動作しているのを見ています。面白い。しかし、whileループを含めてコードを実行する必要がある場合は、どうしたらエラーになるでしょうか?私が '*'演算子を追加したとき、 "nは定義されていません"と固定されましたが、 "sが代わりに定義されていません" – kthonenice

+0

whileループを使用することはほとんどありません。パフォーマンス上の理由から変数。この組み合わせは非常に不可欠で、最初は避ける方がよいです。私は故意にあなたのQを編集しませんでしたが、私はあなたの質問を模倣答えて作業バージョンを貼り付けることができます。 – s952163

+0

@kthoneniceそこに行く。 – s952163

1

n *(n + 1) - オペランド間に '*'がありません。

s <- n(n+1)/2 

が故に機能のようなエラーメッセージをNを呼び出すように扱われる。この場合

1

。代わりに、

s <- n*(n+1)/2 

と記述してください。あなたはそれに注釈を付けると型について明示的にしたい場合でも、単純に言えば

let sum n = 
    let s = n * (n+1)/2 
    printf "%A " s 

let result = sum 4 

::非常に簡単に言えば

+0

ああええ!それは "nは定義された問題ではない"と修正しましたが、今は "sが定義されていません" sは1に設定されているので、ここで何が問題になっていますか? – kthonenice

+0

申し訳ありませんが、変数sをグローバルにしました。エラーメッセージが表示されます。FS0001:この式はint - > int型が必要ですが、ここにint型があります。 私はこれについて疑問を抱いていました。これについて詳しく教えていただけますか? 私はこのような関数を理解しています: sumはint型の引数nをとり、int型を返します。しかし、私は間違った考えを持っていると思う。 (したがって、エラー) – kthonenice

関連する問題