1

私は第 2 オイラーの問題に取り組んでいますが、今のところ、フィボナッチ数列を定義しようとしています。現在、Fib関数を次のように定義しています

Fib 0 = 0
Fib 1 = 1
Fib x = Fib (x - 1) + Fib (x - 2)

プログラムをキーボード入力に依存させたいので、

main = do
        putStrLn "Enter desired Fibonacci index: "
        "index" <- getLine
        putStrLn Fib x

そして、xを次のように定義しましたx = read "index"

インデントと構文の両方を台無しにしていると確信しています。コードの変更方法によっては、「ghc /dir/file.hs を実行すると、「スコープ外: データ コンストラクター `Fib'」や「解析エラー (インデントが正しくない可能性があります)」などのメッセージが表示されます。特に .hs をコンパイラに適したものに設定する方法に関して、私が何をしているのかわかりません.GHCでのコンパイルに関する約7つのチュートリアルを読みましたが、それらはすべて説明する部分をスキップしているようです.コンパイルの基本的な要件。

それが役立つ場合は、より具体的にする方法を教えてください。私が理解しようとしている2つのことは、「メイン」全体がコンパイルにどのように関連しているか、およびFibを関数として定義したことを認識させる方法であると思います。

PS: ここのインデントがわかりません。Stack はすべてを 1 行にまとめたいようです。そのため、すべてを分離する必要があります。ごめん。

4

5 に答える 5

9

Fib の最初の文字は大文字にしないでください。大文字の単語はタイプを示します。関数は小文字で始める必要があります。

コンパイルは問題ないようです!

コンパイル時に、他にもいくつかのエラーが発生します。引数としてputStrLna を取ることを思い出してください。String関数fibは を返しますInteger。を使用showして、値を に変換できますString

于 2009-12-19T08:14:21.210 に答える
5

要約すると:

  • インデントは問題ないようです。
  • 関数名は大文字で始めることはできません。大文字の識別子は、コンストラクター、型、およびモジュール名にのみ使用されます。
  • インタラクティブなインタープリターで自分のものをテストでき、メイン関数は必要ありません。
  • 何らかの計算の結果を保存する場合は変数名が必要なので、結果はではなくgetLineにバインドする必要があります。1 つ目は、文字列ではなく、文字列変数です。index"index"
  • putStrLn1 つのパラメーター (表示される文字列) のみを取ります。プログラムでは、関数と未定義の2 つのパラメーターを受け取ります。Fibx
  • ところでx、おそらくread入力文字列を整数値に変換するために を使用して、 を定義する必要があります。
  • また、putStrLn文字列が必要でFib、整数を返します。渡す前に変換する必要があります: putStrLn (show (Fib x))
于 2009-12-19T12:36:56.367 に答える
2

実際にコンパイルできるように修正されたコードを次に示します。

fib 0 = 0
fib 1 = 1
fib x = fib (x - 1) + fib (x - 2)

main = do
        putStrLn "Enter desired Fibonacci index: "
        index <- getLine
        print (fib (read index))

いくつか問題がありました。関数は小文字で始まります。第二に、整数をputStrLn返し、. なので代わりに使っています。また、文字列 ( ) を変数として使用しようとしました。fromを取得するのは事実ですが、変数に格納する必要があり、変数には引用符がありません。fibfibputStrLnStringprint"index"StringgetLine

バリーが言ったように、関数は本当に必要ないことに注意してくださいmain。フィボナッチ関数をファイルに入れて ghci にロードし、そこから関数を呼び出すだけです。簡単です。

また、あなたのフィボナッチ関数は恐ろしく遅いことに注意してください。

オイラー問題で頑張ってください。Haskell を使ってそれらを解決するのはとても楽しいと思います。

于 2009-12-22T15:14:29.450 に答える
1

メイン関数を気にしないでください。ghci を起動し、モジュールをロードして、fib 関数を直接呼び出すだけです。

于 2009-12-19T08:29:56.133 に答える
1

IIRCgetLineは文字列を返すので、それを変数にバインドする必要があります

do
   idx <- getLine
   print $ fib $ read idx
于 2009-12-19T09:26:28.230 に答える