0

ここ数日 Haskell をいじっていたので、フィボナッチ数列の基本的な定義を作成することにしました。だから私はこのコードを書いた:

main = do
    fib :: (Integral a) => Int -> Int
    fib x
        | x == 0 = 0
        | x == 1 = 1
        | x >= 2 = fib (x - 2) + fib (x - 1)
    do { print (fib 5) }

そして、次のようなエラーメッセージが表示されます。

4:17: parse error on input `|'

タブのエラーが疑われたので、見つけられるすべての空白の修正を試みましたが、何が問題なのかがわかりません!

編集:だから私は人々が提案したことをしました、そして私は今このコードを持っています:

fib :: (Integral a) => Int -> Int
main = do
    fib x
        | x == 0 = 0
        | x == 1 = 1
        | x >= 2 = fib (x - 2) + fib (x - 1)
    print (fib 5)

そして、私は同じエラーが発生しています。

4

3 に答える 3

3

do問題は、ものを定義するための構造を実際に使用せずに、ブロック内で関数を定義しようとしていることです( などlet)。

ブロックの外で関数を定義してみてください:

fib :: (Integral a) => Int -> Int
fib x | x == 0 = 0
      | x == 1 = 1
      | x >= 2 = fib (x - 2) + fib (x - 1)

main = print (fib 5)

関数をローカルに定義することを主張する場合 (doブロックのステートメントによって形成される式の内部):

main = do
    let
        fib :: (Integral a) => Int -> Int
        fib x | x == 0 = 0
              | x == 1 = 1
              | x >= 2 = fib (x - 2) + fib (x - 1)
    print (fib 5)

letを使用して、新しい変数fibを目的の関数にバインドする方法に注目してください。

于 2016-05-06T11:32:28.867 に答える
3

の内部ではなく、fib外部で定義する必要があります。そして、からmain少なくとも 1 つの を削除する必要があります。domain

于 2016-05-04T20:14:58.427 に答える
1

ブロックの外側にfibローカルに定義することもできます。は、さまざまなモナド バインド関数を使用するための構文糖衣であるため、その内部で受け入れられる構文は、外部で受け入れられるものとまったく同じではないことに注意してください。実際、アクションを連鎖させるのではなく呼び出すだけなので、ブロックは必要ありません。maindodomaindoprintIO

main = let
         fib x | x == 0 = 0
               | x == 1 = 1
               | x >= 2 = fib (x - 2) + fib (x + 1)
       in
         print (fib 5)

または、次を使用できますwhere

main = print (fib 5)
       where
         fib x | x == 0 = 0
               | x == 1 = 1
               | x >= 2 = fib (x - 2) + fib (x + 1)

それらは同じです。問題は、ローカルバインディングが実際にどこに行くかです。let..in新しいバインディングがスコープ内にある新しいブロックをwhere提供し、そのバインディングをそれがアタッチされている関数のスコープ内で使用できるようにします。

最終的に可能性が高いと思われるように、複数のアクションを実行doできるようにブロックも必要な場合は、次のように への呼び出しの代わりにそれを配置できます。IOprint

main = let
         fib x | x == 0 = 0
               | x == 1 = 1
               | x >= 2 = fib (x - 2) + fib (x + 1)
       in
         do print (fib 5)
            print (fib 6)
于 2016-05-06T12:17:33.160 に答える