3

私は関数型プログラミングが初めてです。基本的な質問があります。

私は Hugs インタープリターを使用しています。

Haskell で関数を書きたいと思います。いくつかのチュートリアルを実行しましたが、理解できません。

fact :: Int -> Int
fact n = if n == 0 then
1
else
n * fact (n-1)

これにより、構文エラーが発生します:-S

ERROR - Syntax error in input (unexpected `=')
4

4 に答える 4

6

インタラクティブプロンプトにこれを正しく入力すると仮定します。悲しいことに、これらはHaskellでは比較的原始的です-のような複雑な定義は、fact少なくとも通常の書き方とは異なり、プロンプトで入力することはできません。

関数定義などをモジュールに入れてから、(例)を介してそれらをロードする必要があります:load fact.hs。特にこのトピックや他のトピックに関する詳細情報を提供するHugsのリソースがあります(私はhttp://cvs.haskell.org/Hugs/pages/hugsman/index.htmlを使用して仮定を確認しました)。

また、インデントが重要であるため、モジュール内であっても、ここに投稿したようにコードが機能しないことにも注意してください。これらのチュートリアルには正しいバージョンがあります。そうでなければ、それらは役に立たないので、あなたはそれらを忘れるべきです。

于 2011-04-12T14:33:51.027 に答える
4

構文が正しくありません。Haskell では、Python と同じように空白が重要です。より具体的には、行の最初の列から始まるテキストがある場合、インタープリターはそれが最上位の宣言であると見なします。正しい構文は次のようになります (例):

fact :: Int -> Int
fact n = if n == 0
  then 1
  else n * fact (n-1)

必要に応じて、if を 1 行に入れることもできます。したがって、インタラクティブなプロンプトを使用している場合は、次のことができます。

λ> let fact n = if n == 0 then 1 else n * fact (n-1)

プロンプトで関数を定義するには を使用する必要があることに注意しletてください (少なくともこれは GHCi での方法です。Hugs についてはわかりません)。それらを別のファイルに入れてから、インタープリターにロードする方がよいでしょう。とにかく、私の意見では、パターンマッチングを使用する方がはるかに優れたソリューションです。

fact :: Int -> Int
fact 0 = 1
fact n = n * fact (n-1)

ここで、インタプリタは、関数の最初の引数を、リストされている可能性のあるケースに対してパターン マッチングします。したがって、最初の引数が null の場合、結果は 1 になり、それ以外の場合は関数が再帰的に適用されます。

于 2011-04-12T14:36:45.090 に答える
1

たとえば、次のような名前のファイルを作成します。fact.hs

-- copying cedric's nicely formatted code
fact :: Int -> Int
fact n = if n == 0
    then 1
    else n * fact (n-1)

本当にそこにいる必要があるのはそれだけです。実際のモジュールを作成したい場合は、追加の作業を行う必要があります。

次に、同じフォルダーから ghci を開きます。ghci プロンプトで、:lコマンドを使用して「モジュール」をロードします。

Prelude> :l fact.hs
[1 of 1] Compiling Main             ( fact.hs, interpreted )
Ok, modules loaded: Main.
*Main> fact 3
6
*Main> fact 10
3628800

ハグと非常によく似たプロセスだと思います。抱擁では、ファイル名を大文字にする必要があると思います。ghci は単に「メイン」モジュールを作成し、コードをその中に入れます。そのため、プロンプトが からPrelude>に変わります*Main>

小さな Haskell 関数を扱うときは、通常 2 つのターミナルを開いたままにします。1 つは vim 用で、もう 1 つは ghci 用です。vim でファイルを変更 (および保存) するときは:r、ghci を使用して新しい定義をリロードします。

*Main> :r
Ok, modules loaded: Main.
于 2011-04-12T18:09:02.913 に答える
1

この関数を記述する最もエレガントな方法は次のとおりです。

fac n = product [1..n]

詳細については、 http://www.willamette.edu/~fruehr/haskell/evolution.htmlを参照してください。

于 2011-04-12T20:05:40.550 に答える